C# 如何修复文件到二进制到字符串到二进制转换期间的数据丢失

C# How to fix loss of data during file to binary to string to binary conversion

我以二进制形式读取文件,转换为十六进制字符串,再转换回二进制,然后写入新文件。 我希望有一个副本,但得到一个损坏的文件。

我一直在尝试不同的方法将二进制文件转换为十六进制字符串,但似乎无法保留整个文件。

            byte[] binary1 = File.ReadAllBytes(@"....Input.jpg");

            string hexString = "";                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               
            int counter1 = 0;
            foreach (byte b in binary1)
            {
                counter1++;
                hexString += (Convert.ToString(b, 16));
            }

            List<byte> bytelist = new List<byte>();

            int counter2 = 0;
            for (int i = 0; i < hexString.Length/2; i++)
            {
                counter2++;
                    string ch = hexString.Substring(i*2,2);
                bytelist.Add(Convert.ToByte(ch, 16));

            }
            byte[] binary2 = bytelist.ToArray();

            File.WriteAllBytes(@"....Output.jpg", binary2);

计数器 1 和计数器 2 应该是相同的计数,但计数器 2 总是小 10% 左右。

我想获得一个重复的文件输出,我可以通过该字符串值进行传输。

转换字节 10 将得到一个字符,而不是 2 个字符。您的转换返回方法(逻辑上)建立在每字节 2 个字符的基础上。

这个案例有效

byte[] binary1 = new byte[] { 100 }; // convert will result in "64"

这个案例失败了

byte[] binary1 = new byte[] { 10 }; // convert will result in "a"

我快速修复了你的代码,在单个字符的情况下用 "0" 填充。

所以工作代码:

byte[] binary1 = new byte[] { 100 };

string hexString = "";
int counter1 = 0;
foreach (byte b in binary1)
{
    counter1++;
    var s = (Convert.ToString(b, 16));
    // new
    if (s.Length < 2)
    {
        hexString += "0";
    }
    // end new
    hexString += s;
}

List<byte> bytelist = new List<byte>();

int counter2 = 0;
for (int i = 0; i < hexString.Length / 2; i++)
{
    counter2++;
    string ch = hexString.Substring(i * 2, 2);
    var item = Convert.ToByte(ch, 16);
    bytelist.Add(item);

}
byte[] binary2 = bytelist.ToArray();

请注意,您的代码可以使用一些重构,例如不要在循环中串连,并可能检查单一责任原则。

更新,已修复,但这里有更好的解决方案:How do you convert a byte array to a hexadecimal string, and vice versa?