在C#转换字节数组字符串,然后再返回(Converting byte array to string

2019-07-18 00:25发布

所以这里的交易:我试图打开一个文件(从字节),将其转换为字符串,这样我就可以在标题中的一些元数据的混乱,将其转换回字节,并保存它。 我运行到现在的问题是这段代码。 当我比较一个已经来回转换(但不以其他方式修改)原来的字节数组的字符串,它是不平等的。 我怎样才能使这项工作?

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”。

Answer 1:

尝试在静态函数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;
}


Answer 2:

当你有原始字节(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。 鉴于这种情况,你可能会发现,它更容易只是为了保持数据的字节,并在同一时间写替换一个字节的数据。



Answer 3:

由于这样的事实,.NET字符串使用Unicode字符串,你可以不再做这就像人们在做C.在大多数情况下,你不应该甚至试图去从字符串来回< - >字节数组,除非内容实际上是文本

我必须清楚这一点:在.NET中,如果byte[]数据不是文本 ,那就不要试图将其转换为一个string除了特殊的Base64编码在一个文本通道二进制数据。 这是在.NET中工作的人之间的广泛持有的误解。



Answer 4:

您的问题似乎是你比较的字节数组方式:

Response.Write((fileData == recapturedBytes));

因为你比较字节数组,而不是它所包含的值的地址,这将始终返回false。 比较字符串数据,或使用比较字节阵列的方法。 你也可以这样做,而不是:

Response.Write(Convert.ToBase64String(fileData) == Convert.ToBase64String(recapturedBytes));


文章来源: Converting byte array to string and back again in C#