您的位置:首页 > 编程语言 > C#

C#中字节数组与字符串的来回转换

2011-08-12 08:10 351 查看
C#中字节数组与字符串的来回转换会遇到一个奇怪的问题。这个问题是在做网络传送文件时遇到的。

问题如下:

就是把件流形成的字节数组转成字符串发送,对端接收到过后把字符串还原成字节数组然后形成文件流。

这个时候在对端总是发现接收到字节数组长度和发送的长度不一致。于是就做了如下代码进行测试。

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.IO;

namespace ByteTest

{

class Program

{

static void Main(string[] args)

{

int arraysize = 62000; //设置数组大小

FileInfo transfile = new FileInfo(@"D:\\dlap_old.dmp");//随便找一个大于arraysize的文件

FileStream fs = new FileStream(transfile.FullName, FileMode.Open);

BinaryReader fileReader = new BinaryReader(fs, Encoding.Unicode);

byte[] bytedata = new byte[arraysize];

fileReader.Read(bytedata, 0, bytedata.Length);

string temp = Encoding.Unicode.GetString(bytedata); //先将字节数组转换成字符串

byte[] test = Encoding.Unicode.GetBytes(temp); //再将字符串转换成字节数组

//比较转换前后的字节数组bytedata 和test 的差异

if (bytedata.Length == test.Length)

{

for (int k = 0; k < arraysize; k++)

{

if (bytedata[k] != test[k])

Console.WriteLine("位置" + k.ToString() + "存在不一致结果" );

}

Console.WriteLine( "转换检查完成,数组长度一致");

}

else

{

Console.WriteLine( "转换后数组长度不相等");

}

Console.ReadKey();

}

}

}

运行上面的结果很容易看到字节数组经过字符串转换后再转换回来后就已经不是原来的字节数组了,有很多地方会不一致。

如果将编码方式Encoding.Unicode 改成Encoding.Default后会发现两个数组的长度都不一致。

其他的编码方式也进行了测试,其结果不是数组长度不一致就是其内容不一致。

后来在网上找到下面一种转换方法,终于经过转换后得到了同样的字节数组

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.IO;

namespace ByteTest

{

class Program

{

static void Main(string[] args)

{

int arraysize = 62000; //设置数组大小

FileInfo transfile = new FileInfo(@"D:\\dlap_old.dmp");//随便找一个大于arraysize的文件

FileStream fs = new FileStream(transfile.FullName, FileMode.Open);

BinaryReader filereader = new BinaryReader(fs);

byte[] bytedata = filereader.ReadBytes(arraysize);

StringBuilder strb = new StringBuilder();

strb.Append(Convert.ToBase64String(bytedata));

string temp = strb.ToString();

byte[] test = Convert.FromBase64String(temp);

if (bytedata.Length == test.Length)

{

for (int k = 0; k < arraysize; k++)

{

if (bytedata[k] != test[k])

Console.WriteLine("位置" + k.ToString() + "存在不一致结果" );

}

Console.WriteLine( "转换检查完成,数组长度一致");

}

else

{

Console.WriteLine( "转换后数组长度不相等");

}

Console.ReadKey();

}

}

}

至于最终原因因为才学习C#不久,水平有限,未能进一步研究,只是猜测可能是字节编码经过转换成字符串的过程中会有两个字节的形成一个字符编码,有个别字符编码在逆向转换成字节时没有对应的字节编码,所以产生了错误。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息