在某些情況下,比如說串口通信或者讀取二進制的文件,通常會得到一個byte數組形式的數據。
然而對於這個數據處理常常令人苦惱,因為通常通信情況下,並不是一個字節代表一個字符或者某個數據,而是數據夾雜在字節與字節之間。
讀取文件得到的情況:
FileInfo fi = new FileInfo(@"E:\ABC.DAT"); long len = fi.Length; FileStream fs = new FileStream(@"E:\ABC.DAT", FileMode.Open); byte[] buffer = new byte[len]; fs.Read(buffer, 0, (int)len); fs.Close();
1:將一個字節轉換為16進制的字符表示
String str= Convert.ToString(buffer[i], 16); //16進制 String PrintStr = (Convert.ToString(buffer[i2], 16)).PadLeft(2, '0') + " "; //轉換為2個字符長度的(不足左側補零)
2:ASCII編碼存儲的轉換(字節數組buffer的4到17為一個ASCII字符存儲的時間)
string str_stime = Encoding.ASCII.GetString(buffer, 4, 17); DateTime stime = new DateTime(Int32.Parse(str_stime.Substring(0, 4)), Int32.Parse(str_stime.Substring(4, 2)), Int32.Parse(str_stime.Substring(6, 2)), Int32.Parse(str_stime.Substring(8, 2)), Int32.Parse(str_stime.Substring(10, 2)), Int32.Parse(str_stime.Substring(12, 2)), Int32.Parse(str_stime.Substring(14, 3)));
3:如果某個數據存儲在字節之間
如2個字節 0000|0000||0000|0000
字節0 字節1
這兩個字節的前5個bit表示一個數據,再6個bit表示一個數據,后5個bit又表示一個數據
由於在C#中int為32位數據,可以存儲4個字節的數據,int16可以表示2個字節,然后通過移位和位運算來處理。
int16 iData = buffer[1] + (buffer[0] << 8) iData1 = iDate & 0x1F; iData2 = (iDate >> 5) & 0x3F; iData2 = (iDate >> 11) & 0x1F;
如有錯誤,敬請指教。