轉(zhuǎn)帖|其它|編輯:郝浩|2011-08-17 15:14:41.000|閱讀 1607 次
概述:在C#中字節(jié)數(shù)組與字符串的來回轉(zhuǎn)換會遇到一個奇怪的問題.這個問題是在做網(wǎng)絡(luò)傳送文件時遇到的本文主要解決了C#中字節(jié)數(shù)組與字符串來回轉(zhuǎn)換的問題。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
在C#中字節(jié)數(shù)組與字符串的來回轉(zhuǎn)換會遇到一個奇怪的問題.這個問題是在做網(wǎng)絡(luò)傳送文件時遇到的.
問題如下:
就是把件流形成的字節(jié)數(shù)組轉(zhuǎn)成字符串發(fā)送,對端接收到過后把字符串還原成字節(jié)數(shù)組然后形成文件流.
這個時候在對端總是發(fā)現(xiàn)接收到字節(jié)數(shù)組長度和發(fā)送的長度不一致.于是就做了如下代碼進(jìn)行測試.
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; //設(shè)置數(shù)組大小
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); //先將字節(jié)數(shù)組轉(zhuǎn)換成字符串
byte[] test = Encoding.Unicode.GetBytes(temp); //再將字符串轉(zhuǎn)換成字節(jié)數(shù)組
//比較轉(zhuǎn)換前后的字節(jié)數(shù)組bytedata 和test 的差異
if (bytedata.Length == test.Length)
{
for (int k = 0; k < arraysize; k++)
{
if (bytedata[k] != test[k])
Console.WriteLine("位置" + k.ToString() + "存在不一致結(jié)果" );
}
Console.WriteLine( "轉(zhuǎn)換檢查完成,數(shù)組長度一致");
}
else
{
Console.WriteLine( "轉(zhuǎn)換后數(shù)組長度不相等");
}
Console.ReadKey();
}
}
}
運(yùn)行上面的結(jié)果很容易看到字節(jié)數(shù)組經(jīng)過字符串轉(zhuǎn)換后再轉(zhuǎn)換回來后就已經(jīng)不是原來的字節(jié)數(shù)組了,有很多地方會不一致.
如果將編碼方式Encoding.Unicode 改成Encoding.Default后會發(fā)現(xiàn)兩個數(shù)組的長度都不一致.
其他的編碼方式也進(jìn)行了測試,其結(jié)果不是數(shù)組長度不一致就是其內(nèi)容不一致.
后來在網(wǎng)上找到下面一種轉(zhuǎn)換方法,終于經(jīng)過轉(zhuǎn)換后得到了同樣的字節(jié)數(shù)組
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; //設(shè)置數(shù)組大小
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() + "存在不一致結(jié)果" );
}
Console.WriteLine( "轉(zhuǎn)換檢查完成,數(shù)組長度一致");
}
else
{
Console.WriteLine( "轉(zhuǎn)換后數(shù)組長度不相等");
}
Console.ReadKey();
}
}
}
至于最終原因因?yàn)椴艑W(xué)習(xí)C#不久,水平有限,未能進(jìn)一步研究,只是猜測可能是字節(jié)編碼經(jīng)過轉(zhuǎn)換成字符串的過程中會有兩個字節(jié)的形成一個字符編碼,有個別字符編碼在逆向轉(zhuǎn)換成字節(jié)時沒有對應(yīng)的字節(jié)編碼,所以產(chǎn)生了錯誤.
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉(zhuǎn)載自:網(wǎng)絡(luò)轉(zhuǎn)載