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

C#如何修复文件到二进制到字符串到二进制转换期间的数据丢失,c#,file-io,binary,type-conversion,hex,C#,File Io,Binary,Type Conversion,Hex,我将文件读取为二进制,转换为十六进制字符串,再转换回二进制,然后写入新文件。 我期待一个重复的,但得到一个损坏的文件 我一直在尝试不同的方法将二进制文件转换为十六进制字符串,但似乎无法保留整个文件 byte[] binary1 = File.ReadAllBytes(@"....Input.jpg"); string hexString = "";

我将文件读取为二进制,转换为十六进制字符串,再转换回二进制,然后写入新文件。 我期待一个重复的,但得到一个损坏的文件

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

            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);
byte[]binary1=File.ReadAllBytes(@“…Input.jpg”);
字符串hexString=“”;                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               
int计数器1=0;
foreach(二进制1中的字节b)
{
计数器1++;
hextstring+=(Convert.ToString(b,16));
}
List bytelist=新列表();
int计数器2=0;
for(int i=0;i
计数器1和计数器2应该是相同的计数,但计数器2总是小约10%


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

转换字节
10
将得到一个字符,而不是两个字符。您的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=新字节[]{100};
字符串hextstring=“”;
int计数器1=0;
foreach(二进制1中的字节b)
{
计数器1++;
var s=(Convert.ToString(b,16));
//新的
如果(s.长度<2)
{
十六进制字符串+=“0”;
}
//结束新的
十六进制字符串+=s;
}
List bytelist=新列表();
int计数器2=0;
for(int i=0;i
请注意,您的代码可能需要一些重构,例如,不要在循环中字符串concat,或者检查单一责任原则


更新,已修复,但这里有更好的解决方案:

您应该检查哪些字节不同。这可以帮助您解决这个问题。大多数字节是不同的,大约95%。这可能是由于缺少字节导致列表相互偏移。是否有小字节数组来重现此问题?(要替换'byte[]binary1`),我可以用.jpg文件类型给它的最小输入仍然有600个字节,而且似乎只是删除了一些字节。如果我给它一个.txt文件,它可以正常工作,没有错误参见回答我不知道{10}vs{100}的作用,但是您提供的链接有一个有效的解决方案。