将二进制数据转换为2的补码,然后放入输出数组

本文关键字:然后 数组 输出 补码 数据 二进制 转换 | 更新日期: 2023-09-27 18:24:09

场景:

我有二进制数据。我的要求是,我需要一个按以下顺序包含的字节输出数组:

  • 按顺序读取每2个字节
  • 然后转换为2的补码
  • 然后放置到输出阵列中

请帮帮我。

将二进制数据转换为2的补码,然后放入输出数组

假设问题中的二进制数据实际上是数组

  Byte[] binaryData = new Byte[] {
    0x12, 0x13, 0x14, 0x15
  };
  Byte[] result = Enumerable
    .Range(0, binaryData.Length / 2)
    .Select(index => unchecked(BitConverter.ToInt16(binaryData, index * 2)))
    //.Select(item => (Int16) unchecked((item << 8) | (item >> 8))) // if you want to swap the endians
    .Select(value => (Int16) unchecked(~value + 1))
    .SelectMany(value => unchecked(new Byte[] {(Byte) (value >> 8), (Byte) (value & 0xFF)}))
    .ToArray();
  // Test
  // "ec, ee, ea, ec"
  // ("ed, ed, eb, eb" when endians are swapped)
  Console.Write(String.Join(", ", result.Select(item => item.ToString("x2"))));

编辑:如果(参见注释)每个字节(而不是2字节单词)都应该更改:

Byte[] binaryData = new Byte[] {
   224, 46
};
Byte[] result = binaryData
  .Select(b => unchecked((Byte) (~b + 1)))
  .ToArray();
// "20 D2"
Console.Write(String.Join(", ", result.Select(item => item.ToString("x2"))));