【问题标题】:Converting int value into 3 byte array (and vice versa)将 int 值转换为 3 字节数组(反之亦然)
【发布时间】:2012-12-27 21:21:07
【问题描述】:

我正在开发一个从硬件设备读取/写入数据的 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 的最重要字节,然后对其进行转换,但是有更好的方法吗?

【问题讨论】:

  • 您混淆了最不重要和最重要。您绝对不想删除这些值的最低有效字节。您正在考虑最重要的字节。
  • 噢!感谢您的指正。 ;-)

标签: c# bytearray bitconverter


【解决方案1】:

我认为位移和| 运算符应该是最有效的方法。

int i = (bytes[2] << 0) | (bytes[1] << 8) | (bytes[0] << 16);

另外,作为提醒,您要删除 重要字节,而不是 最不重要 重要字节;p

【讨论】:

  • 也感谢您指出我在重要字节之间的混淆。
【解决方案2】:
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

【讨论】:

  • 感谢您的建议。我一直对 LINQ 的强大功能感到惊讶。
猜你喜欢
  • 2015-02-16
  • 1970-01-01
  • 2013-11-11
  • 2013-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多