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

本文关键字:转换 字符串 出错 数组 字节数 算法 字节 | 更新日期: 2023-09-27 18:26:39

我想使用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(数组src、Int32-srcOffset、数组dst、Int32-dstOffset、Int32计数)

我知道这个solution发布了1000次,但没有人在这个代码中解决这个问题

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

首先,您需要知道文件的编码是什么。然后,您可以使用System.Text.Encoding类方便地将字节数组转换为字符串。

例如,如果您的文件是UTF-8,您可以简单地执行:

string s = System.Text.Encoding.UTF8.GetString(bytes);

如果您的编码不同,只需从Encoding类中选择一个不同的属性,但模式是相同的。

编辑:关于OP代码不起作用的简短解释

您原始文章中的代码试图将字节数组解释为与char类型(即UTF-16)的编码相同。因此,除非您的文件碰巧使用UTF-16编码,否则它根本无法工作。使用Encoding类是可行的。

为什么不尝试使用默认编码参见下面的片段

var strString = System.Text.Encoding.Default.GetString(File.Readallbytes(myfile));

所以我用这段代码解决了这个问题它在ByteArrayToString中给了我错误,因为字节长度是奇数所以我要做的是检查字节长度是否是偶数它正常地执行代码,但当它是奇数时,它在字节的末尾添加一个字节作为{0},它将是偶数

这是我的代码:

if (bytes.Length % 2 != 0) { 
                    byte[] newArray = new byte[bytes.Length + 1];
                    bytes.CopyTo(newArray, 1);
                    newArray[0] = byte.Parse("0");
                    bytes= newArray;
                }