当前位置:  开发笔记 > 编程语言 > 正文

在C#中将字节数组转换为字符串并再返回

如何解决《在C#中将字节数组转换为字符串并再返回》经验,为你挑选了3个好方法。

所以这是交易:我正在尝试打开一个文件(从字节),将其转换为字符串,以便我可以在标题中混淆一些元数据,将其转换回字节,然后保存.我现在遇到的问题是使用此代码.当我比较来回转换(但没有修改)的字符串到原始字节数组时,它是不相等的.我怎样才能做到这一点?

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".



1> Adam Robinso..:

尝试在Encoding类上提供静态函数,为您提供各种编码的实例.您不需要实例化Encodingjust以转换为/从字节数组转换.你是如何比较代码中的字符串的?

编辑

你在比较数组,而不是字符串.它们是不平等的,因为它们指的是两个不同的阵列; 使用==运算符只会比较它们的引用,而不是它们的值.您需要检查数组的每个元素,以确定它们是否相同.

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;
}


看一下UTF8编码的文档.可以选择是否指定序言.如果您发现生成的字节数组比原始字节长,则可能是您的问题.同样,您需要确保UTF8实际上是正确的编码.至于你怎么说,你将不得不问谁向你提供数据.

2> J.Merrill..:

当你有原始字节(8位可能不可打印的字符)并想要将它们作为.NET字符串操作并将它们转回字节时,你可以通过使用

Encoding.GetEncoding(1252)

而不是UTF8Encoding.该编码可以获取任何8位值并将其转换为.NET 16位字符,然后再返回,而不会丢失任何信息.

在上面描述的特定情况下,使用二进制文件,您将无法"弄乱标题中的元数据"并使事情正常工作,除非您使用的数据长度不变.例如,如果标头包含

{any}{any}ABC{any}{any}

并且你想将ABC改为DEF,这应该按你的意愿工作.但是如果要将ABC更改为WXYZ,则必须在"C"之后的字节上进行写操作,否则您将(实质上)将所有内容向右移动一个字节.在典型的二进制文件中,这会使事情变得非常糟糕.

如果"ABC"之后的字节是空格或空字符,那么编写更大的替换数据的机会就更有可能不会造成麻烦 - 但是你仍然无法用.NET字符串中的WXYZ替换ABC,使其更长 - 你会必须用WXYZ替换ABC {whatever_follows_it}.鉴于此,您可能会发现将数据保留为字节并将替换数据一次写入一个字节更容易.



3> Sam Harwell..:

由于.NET字符串使用Unicode字符串这一事实,你不能再像C语言那样做了.在大多数情况下,你甚至不应该尝试从字符串< - >字节数组来回,除非内容实际上是文字.

我必须明确这一点:在.NET中,如果byte[]数据不是文本,则不要尝试将其转换为string除了文本通道上二进制数据的特殊Base64编码.这是在.NET中工作的人们普遍存在的误解.


字符串< - > byte []转换通常应该通过System.Text.Encoding类之一,而不是BitConverter类完成.BitConverter.ToString将字节数组转换为数字的十六进制字符串表示形式,它不会**将字节数组转换为字符串.
推荐阅读
爱唱歌的郭少文_
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有