轉帖|其它|編輯:郝浩|2011-08-17 15:14:41.000|閱讀 1607 次
概述:在C#中字節數組與字符串的來回轉換會遇到一個奇怪的問題.這個問題是在做網絡傳送文件時遇到的本文主要解決了C#中字節數組與字符串來回轉換的問題。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
在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#不久,水平有限,未能進一步研究,只是猜測可能是字節編碼經過轉換成字符串的過程中會有兩個字節的形成一個字符編碼,有個別字符編碼在逆向轉換成字節時沒有對應的字節編碼,所以產生了錯誤.
本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉載自:網絡轉載