【问题标题】:C# How to fix loss of data during file to binary to string to binary conversionC#如何修复文件到二进制到字符串到二进制转换期间的数据丢失
【发布时间】:2019-11-08 20:50:18
【问题描述】:

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

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

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

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

【问题讨论】:

  • 您应该检查哪些字节不同。这可以帮助您解决这个问题。
  • 大部分字节不同,大约 95%。这可能是由于缺少字节导致列表彼此偏移。
  • 你有一个小字节数组来重现问题吗? (替换`byte[] binary1`)
  • 我可以使用 .jpg 文件类型提供的最小输入仍然有 600 个字节,而且似乎仍然只是丢掉了一些字节。如果我给它一个 .txt 文件,它可以正常工作。
  • 得到它已经可以用 1 个字节重现 ;) 查看答案

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


【解决方案1】:

转换字节 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();

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

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

【讨论】:

  • 我不知道 { 10 } vs { 100 } 是做什么的,但您提供的链接具有有效的解决方案。
猜你喜欢
  • 2014-01-19
  • 1970-01-01
  • 2014-06-09
  • 1970-01-01
  • 1970-01-01
  • 2011-02-28
  • 2016-08-30
  • 1970-01-01
相关资源
最近更新 更多