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

时间:2019-06-26 20:53:59

标签: c# file-io binary type-conversion hex

我将文件读取为二进制文件,转换为十六进制字符串,转换回二进制文件,然后写入新文件。 我希望重复,但是文件损坏。

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

            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%。

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

1 个答案:

答案 0 :(得分:1)

转换字节10将给出一个字符,而不是2个字符。您的convert back方法(逻辑上)每字节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();

请注意,您的代码可能会使用某些重构,例如不要将concat串成一个循环,也许要检查“单一责任原则”。

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