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?
我以二进制形式读取文件,转换为十六进制字符串,再转换回二进制,然后写入新文件。 我希望有一个副本,但得到一个损坏的文件。
我一直在尝试不同的方法将二进制文件转换为十六进制字符串,但似乎无法保留整个文件。
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?