如何从字节数组中获取无符号长
本文关键字:获取 无符号 数组 字节数 字节 | 更新日期: 2023-09-27 18:12:51
我有一个来自测试设备的传入字节数组。字节数组可以是两个字节或四个字节长。我编写了以下代码来将这些字节数组转换为无符号长长度:
private ulong GetUlongFrom2Bytes(byte MSB, byte LSB)
{
return (ulong)((MSB << 8) + (LSB));
}
private ulong GetUlongFrom4Bytes(byte MSB, byte msb, byte lsb, byte LSB)
{
return (ulong)((MSB << 24) + (msb << 16) + (lsb << 8) + (LSB));
}
相反,如果要进行相反的操作,则执行以下代码:
private byte[] Get4Bytes(ulong parm1)
{
byte[] retVal = new byte[4];
retVal[0] = (byte)((parm1 >> 24) & 0xFF);
retVal[1] = (byte)((parm1 >> 16) & 0xFF);
retVal[2] = (byte)((parm1 >> 8) & 0xFF);
retVal[3] = (byte)(parm1 & 0xFF);
return retVal;
}
private byte[] Get8Bytes(ulong parm1, ulong parm2)
{
byte[] retVal = new byte[8];
Array.Copy(Get4Bytes(parm1), 0, retVal, 0, 4);
Array.Copy(Get4Bytes(parm2), 0, retVal, 4, 4);
return retVal;
}
我正试图调试我的代码来控制这台设备,我只是想从你们这里得到一个健全的检查,以确认这段代码是为我想做的事情正确编写的。
假设您想要大端编码,那么可以:这很好。您也可以使用BitConverter
,但我认为您不这样做是正确的-它涉及额外的数组分配,并将系统的端序强加给您(通常是小端序)。
private void Write32(ulong value, byte[] buffer, int offset)
{
buffer[offset++] = (byte)((value >> 24) & 0xFF);
buffer[offset++] = (byte)((value >> 16) & 0xFF);
buffer[offset++] = (byte)((value >> 8) & 0xFF);
buffer[offset] = (byte)(value & 0xFF);
}
可以这样做:
static ulong SliceValue(byte[] bytes, int start, int length)
{
var bytes = bytes.Skip(start).Take(length);
ulong acc = 0;
foreach (var b in bytes) acc = (acc * 0x100) + b;
return acc;
}