【问题标题】:Storing 4x 0-16 numbers in a short (or 2 numbers in a byte)将 4 个 0-16 数字存储在一个短字节中(或 2 个数字存储在一个字节中)
【发布时间】:2021-01-04 06:21:45
【问题描述】:

我将一些二进制数据打包为一个简短的,但希望有 0-F 的 4x 值。并且希望在没有一堆 switch() 案例读取十六进制的 string.split 的情况下做到这一点

有人对此有一个聪明、优雅的解决方案,还是我应该直接解决?

例如; 1C4A = (1, 12, 4, 10)

【问题讨论】:

  • 请显示您到目前为止尝试了什么。
  • Title 在一个字节中指定 2x 个数字。 Body 指定了 4x 个数字。请更正其中一项。
  • 如果你想要两个字节,我会说在结构上使用 ExplicitLayout,但你不能在 base16 上这样做

标签: c# hex pack


【解决方案1】:

移入移出

var a = 1;
var b = 12;
var c = 4;
var d = 10;

// in
var packed = (short) ((a << 12) | (b << 8) | (c << 4) | d);

// out
a = (packed >> 12) & 0xf;
b = (packed >> 8) & 0xf;
c = (packed >> 4) & 0xf;
d = packed & 0xF;

Console.WriteLine(a);
Console.WriteLine(b);
Console.WriteLine(c);
Console.WriteLine(d);

输出

1
12
4
10

【讨论】:

    【解决方案2】:

    您可以移动 4(或除以和乘以 16)以将数字移动到不同的位置值。然后屏蔽并移动您的打包号码以恢复您的原始号码。

    例如,如果你想存储 1 和 2,你可以这样做:

    int packed = (1 << 4) + 2;
    int v1 = (packed & 0xF0) >> 4;
    int v2 = packed & 0x0F;
    
    Console.WriteLine($"{v1}, {v2}");
    >>> 1, 2
    

    【讨论】:

      猜你喜欢
      • 2011-12-16
      • 2017-05-01
      • 1970-01-01
      • 2011-03-31
      • 2015-04-14
      • 1970-01-01
      • 1970-01-01
      • 2019-10-02
      • 1970-01-01
      相关资源
      最近更新 更多