在此算法中将字节数组转换为字符串时出错[重复]

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

以上是关于在此算法中将字节数组转换为字符串时出错[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何在Go中将字节数组转换为字符串[重复]

如何在C#中将字节转换为字符串[重复]

如何在c ++中将int数组转换为字节数组[重复]

如何在c ++中将数组字节转换为字符串?

在 C# 中将字符串转换为字节数组

在java中将字符串转换为字节[重复]