C# 对字节/字节数组的各种操作

最近在做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/csharp/programming-guide/types/how-to-convert-a-byte-array-to-an-int

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");

 

posted @ 2022-02-28 15:34  老铁你咋这么肥  阅读(3815)  评论(0编辑  收藏  举报