所以这里的交易:我试图打开一个文件(从字节),将其转换为字符串,这样我就可以在标题中的一些元数据的混乱,将其转换回字节,并保存它。 我运行到现在的问题是这段代码。 当我比较一个已经来回转换(但不以其他方式修改)原来的字节数组的字符串,它是不平等的。 我怎样才能使这项工作?
public static byte[] StringToByteArray(string str)
{
UTF8Encoding encoding = new UTF8Encoding();
return encoding.GetBytes(str);
}
public string ByteArrayToString(byte[] input)
{
UTF8Encoding enc = new UTF8Encoding();
string str = enc.GetString(input);
return str;
}
下面是我如何对它们进行比较。
byte[] fileData = GetBinaryData(filesindir[0], Convert.ToInt32(fi.Length));
string fileDataString = ByteArrayToString(fileData);
byte[] recapturedBytes = StringToByteArray(fileDataString);
Response.Write((fileData == recapturedBytes));
我敢肯定,这是UTF-8,使用:
StreamReader sr = new StreamReader(filesindir[0]);
Response.Write(sr.CurrentEncoding);
返回“System.Text.UTF8Encoding”。
尝试在静态函数Encoding
类,为您提供了各种编码的实例。 你不应该需要实例化Encoding
只是转换到/从一个字节数组。 你如何比较在代码中的字符串?
编辑
你比较数组,而不是字符串。 他们是不平等的,因为他们指的是两个不同的阵列; 使用==
操作符只比较它们的引用,而不是它们的值。 你需要检查数组的每个元素,以确定它们是否是等价的。
public bool CompareByteArrays(byte[] lValue, byte[] rValue)
{
if(lValue == rValue) return true; // referentially equal
if(lValue == null || rValue == null) return false; // one is null, the other is not
if(lValue.Length != rValue.Length) return false; // different lengths
for(int i = 0; i < lValue.Length; i++)
{
if(lValue[i] != rValue[i]) return false;
}
return true;
}
当你有原始字节(8位可能 - 不打印的字符),并希望操纵它们作为.NET字符串,并把它们放回字节,则可以使用这样做
Encoding.GetEncoding(1252)
而不是UTF8Encoding。 该编码工作采取任何8位值,并将其转换为.NET 16位字符,然后返回,而不会丢失任何信息。
在你上面的描述,与二进制文件中的特定情况下,您将无法“惹的标题元”,并有东西正常工作,除非该数据的长度,你惹不变。 例如,如果当标头包含
{any}{any}ABC{any}{any}
并希望ABC更改为DEF,应该工作,只要你愿意。 但是,如果你想ABC更改为WXYZ,你将不得不写在后面“C”的字节,或者你会(本质)一个字节还移动一切权利。 在一个典型的二进制文件,这将误事很大。
如果“ABC”后的字节是空格或空字符,有一个更好的机会,更大的写入替换数据不会造成麻烦 - 但你还是不能只用WXYZ代替ABC在.NET字符串,使其不再 - 你会必须更换ABC {} whatever_follows_it与WXYZ。 鉴于这种情况,你可能会发现,它更容易只是为了保持数据的字节,并在同一时间写替换一个字节的数据。
由于这样的事实,.NET字符串使用Unicode字符串,你可以不再做这就像人们在做C.在大多数情况下,你不应该甚至试图去从字符串来回< - >字节数组,除非内容实际上是文本 。
我必须清楚这一点:在.NET中,如果byte[]
数据不是文本 ,那就不要试图将其转换为一个string
除了特殊的Base64编码在一个文本通道二进制数据。 这是在.NET中工作的人之间的广泛持有的误解。
您的问题似乎是你比较的字节数组方式:
Response.Write((fileData == recapturedBytes));
因为你比较字节数组,而不是它所包含的值的地址,这将始终返回false。 比较字符串数据,或使用比较字节阵列的方法。 你也可以这样做,而不是:
Response.Write(Convert.ToBase64String(fileData) == Convert.ToBase64String(recapturedBytes));