在此算法中将字节数组转换为字符串时出错[重复]
Posted
技术标签:
【中文标题】在此算法中将字节数组转换为字符串时出错[重复]【英文标题】:Error While Converting Byte array to string in this algorithm [duplicate] 【发布时间】:2016-03-18 02:26:12 【问题描述】:我想使用File.Readallbytes(myfile)
读取文件并将其转换为类似字符串
string s=ByteArraytoString(File.Readallbytes(myfile));
但它并不适用于我选择的每个文件,而是当文件是 unicode 时它可以工作文件,否则它不会,所以如果有人可以帮助我
public static string ByteArrayToString(byte[] bytes)
char[] chars = new char[(bytes.Length / sizeof(char))];
Buffer.BlockCopy(bytes, 0, chars, 0, bytes.Length);
return new string(chars);
public static byte[] StringToByteArray(string s)
byte[] bytes = new byte[s.Length * sizeof(char)];
Buffer.BlockCopy(s.ToCharArray(), 0, bytes, 0, bytes.Length);
return bytes;
所以例外是:在 ByteArrayToString 方法中
System.ArgumentException:偏移量和长度超出了数组的范围,或者计数大于从索引到源集合末尾的元素数。 在 System.Buffer.BlockCopy(Array src, Int32 srcOffset, Array dst, Int32 dstOffset, Int32 count)
我知道这个解决方案发布了 1000 次,但没有人在这段代码中解决这个问题
【问题讨论】:
【参考方案1】:所以我用这段代码解决了问题
它给了我ByteArrayToString
的错误,因为 bytes.length 是奇数
所以我要做的是检查 bytes.length 是否是偶数,它可以正常执行代码,但是当它很奇怪时,它会在字节末尾添加一个字节作为 0 到它会是偶数
这是我的代码:
if (bytes.Length % 2 != 0)
byte[] newArray = new byte[bytes.Length + 1];
bytes.CopyTo(newArray, 1);
newArray[0] = byte.Parse("0");
bytes= newArray;
【讨论】:
是的,这样可以避免异常,但是如果文件不是 UTF-16,你会得到一个数据损坏的字符串。【参考方案2】:首先,您需要知道文件的编码是什么。然后,您可以使用System.Text.Encoding 类方便地将字节数组转换为字符串。
例如,如果您的文件是 UTF-8 格式,您可以这样做:
string s = System.Text.Encoding.UTF8.GetString(bytes);
如果您的编码不同,只需从 Encoding
类中选择不同的属性,但模式相同。
编辑:关于为什么 OP 的代码不起作用的简短说明
您原始帖子中的代码试图解释字节数组,就好像它已经采用与 char
类型相同的编码,即 UTF-16。因此,除非您的文件碰巧使用 UTF-16 编码,否则它根本无法工作。使用Encoding
类是可行的方法。
【讨论】:
它是 windows-1252 或者它所谓的 Westren 那么你可以使用System.Text.Encoding.GetEncoding("windows-1252").GetString(bytes)
,或者,如果windows-1252
是你的默认操作系统编码,你可以简单地使用System.Text.Encoding.Default.GetString(bytes)
我认为 OP 不是在寻找实际执行正确转换的代码(“解决方案发布了 1000 次”),而是在修复提供的代码中的错误。否则它应该只是重复的。
@Alexei:他的代码无法修复,因为它设计为仅适用于 UTF-16。解决方法是使用Encoding
类。你不同意吗?
@Alexei:同意。我标记为重复。我确实编辑了我的答案,以明确他的代码是 UTF-16 特定的。我认为 OP 确实需要了解这一点。【参考方案3】:
为什么不尝试使用默认编码 见下sn-p
var strString = System.Text.Encoding.Default.GetString(File.Readallbytes(myfile));
【讨论】:
为什么 OP 应该“尝试”这样做?您的建议与其他答案有何不同? 因为我不知道我要选择什么样的文件,可能是 unicode 或 utf-8 或者什么 @MohemmadAlBughdadi 请务必阅读joelonsoftware.com/articles/Unicode.html以上是关于在此算法中将字节数组转换为字符串时出错[重复]的主要内容,如果未能解决你的问题,请参考以下文章