将int值转换为3字节数组(反之亦然)
本文关键字:数组 字节数 反之亦然 字节 int 转换 | 更新日期: 2023-09-27 17:49:37
我正在开发一个C#WinForms应用程序,该应用程序可以向硬件设备读取数据或从硬件设备写入数据。我的应用程序有一个多选列表框,其中包含数字1-100000,用户最多可以选择10个数字。当他们选择完每个数字后,用户单击一个按钮,我的事件处理程序代码需要使用3个字节来构建一个固定大小(30字节(的字节数组来表示每个选择的数字,如果选择的数字少于10个,则填充该数组。
举个例子,假设我的用户选择以下值:
17
99152
3064
52588
65536
我目前正在使用此代码将每个数字转换为一个字节数组:
byte[] bytes = BitConverter.GetBytes(selectedNumber);
Array.Reverse(bytes) // because BitConverter.IsLittleEndian() = true
Debug.WriteLine(BitConverter.ToString(bytes));
对于我上面列出的数字,这会产生以下结果:
00-00-00-11
00-01-83-50
00-00-0B-F8
00-00-CD-6C
00-01-00-00
BitConverter给了我一个4字节的数组,其中我只有3个字节的空间来存储最后一个字节数组中的每个数字。我可以去掉每个字节数组中最重要的字节,然后像这样构建我的最终数组:
00-00-11-01-83-50-00-0B-F8-00-CD-6C-01-00-00-[padding here]
将其写入设备应该可以。但是从设备中读取数组(或类似的数组(会给我带来一些问题。当我有一个3字节的数组,并尝试使用此代码将其转换为int时。。。
int i = BitConverter.ToInt32(bytes, 0);
我得到"目标数组不够长,无法复制集合中的所有项。"我想我可以在每三个字节的开头插入一个最高有效字节0x00,然后进行转换,但有更好的方法吗?
我认为比特移位和|
运算符应该是最有效的方法。
int i = (bytes[2] << 0) | (bytes[1] << 8) | (bytes[0] << 16);
此外,作为提醒,您将删除最高有效字节,而不是最低重要字节;p
byte[] bytes = new byte[] { 0x00, 0x00, 0x11, 0x01, 0x83, 0x50, 0x00, 0x0B, 0xF8 };
var ints = bytes.Select((b, i) => new { b, i })
.GroupBy(x => x.i / 3)
.Select(g => BitConverter.ToInt32(
new byte[] { 0 }.Concat(g.Select(x => x.b))
.Reverse()
.ToArray(),
0))
.ToArray();
或经典
var ints = new List<int>();
for (int i = 0; i < bytes.Length; i+=3)
{
int intI=0;
for (int j = i; j < i + 3; j++)
{
intI = intI * 256 + bytes[j]; //or (intI << 8) + bytes[j];
}
ints.Add(intI);
}
ints
将是17, 99152 and 3064