最近在做socket服務器,需要解析硬件的自定義協議,發現自己對C#的byte操作一竅不通,故記錄下來
1、單字節byte轉int
byte b1=0x1f; int int1=b1; //或者 var b1 = new byte[] { 0x1f, 0 ,0b00011111}; int int1= a[0];
其實byte存的是二進制數據,但是我們在程序中可以直接給byte賦值 2進制、10進制、16進制的數字,同理,我們從byte取出數據時,也可以直接按字節取出來,比如int a1=b1[0],程序會自動將byte轉成int類型。當然此處只針對單字節取數字的做法,不同的協議會有不同的存放數據的方法,具體還是要看協議定義。
2、int轉單字節byte
int int1 = 128;byte value1 = (byte) int1;
同理,沒什么好說的。
3、字節數組轉int(兩個字節以上)
比如現在有一個協議,用兩個字節存一個int數字,那么我們可以用BitConverter類進行轉換。
此示例初始化字節數組,並在計算機體系結構為 little-endian(即首先存儲最低有效字節)的情況下反轉數組,然后調用 ToInt16(Byte[], Int32) 方法以將數組中的四個字節轉換為
byte[] bytes = { 0, 0, 0, 25 };
// If the system architecture is little-endian (that is, little end first),
// reverse the byte array.
if (BitConverter.IsLittleEndian)
Array.Reverse(bytes);
int i = BitConverter.ToInt16(bytes, 0); // 第二個參數表示開始位置
Console.WriteLine("int: {0}", i);
// Output: int: 25
BitConverter類提供了字節數組和基數據類型的相互轉換,使用過程中要注意計算機構的大小端
具體請查看微軟官方文檔:
https://docs.microsoft.com/zh-cn/dotnet/api/system.bitconverter?view=net-6.0
3、字節數組轉字符串 具體編碼還是要看具體環境而言
byte[] bytes = { 66,83 };
Encoding.UTF8.GetString(bytes);
//使用GB2312需要先在主程序入口注冊 Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
Encoding.GetEncoding("GB2312").GetString(bytes);
//轉16進制字符串 XX-XX-XX-XX-XX
BitConverter.ToString(bytes);
4、字符串轉字節數組
Encoding.UTF8.GetBytes("it is a string");
Encoding.GetEncoding("GB2312").GetBytes("it is a string");