我将文件读取为二进制文件,转换为十六进制字符串,转换回二进制文件,然后写入新文件。 我希望重复,但是文件损坏。
我一直在尝试将二进制文件转换为十六进制字符串的各种方法,但似乎无法保留整个文件。
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%。
我想获得一个本可以通过该字符串值传输过来的重复文件输出。
答案 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?