我有(签名)int8_t的指针

int8_t *data


它来自netcdf文件,其中数据编码为int8数组。为了限制文件大小并尽可能使用最便宜的表示形式,实际上是一系列大小不同(4、8、16和32位)的带符号整数的序列,它们的组织在其他位置指定,并且与该问题无关。

如果我想将数据解释为int16或int32,我可以这样做(在StoryTeller对在这种情况下使用reinterpret_cast的未定义行为发表评论后进行了更新):

int16_t data_16
memcpy(&data_16, &data[index], sizeof(int16_t));
int data_16_32 = data_16


但是,如果将数据解释为int4(在一个int8内存空间中有两个int4),如何检索int4值? int4类型在C中不存在。

简而言之,我的问题是:何将int8变量解释为两个int4

我想这个话题可能有用,但我不太了解:
https://codereview.stackexchange.com/questions/30593/split-a-long-integer-into-eight-4-bit-values

最佳答案

屏蔽掉这两个4位整数,如果它们是有符号的,则需要小心,无符号的不要太多。

对于无符号整数,您可以简单地执行以下操作:

uint8_t original = 0xab;  // Source 8 bit data
uint8_t low = original & 0x0f // Mask off the high bits and leave just the low bits
uint8_t high = original >>4; // Move the high bits to the low bits


如果您有4位带符号整数,则需要先将它们向左移,然后再再次向右移动以保持符号状态

int8_t original = 0xef; // Source 8 bit data -2 (high)and -1 (low)
int8_t low = original << 4;  // Move left 4 bits first
low = low >> 4;  // Move bits right but maintain sign
int8_t high = original >> 4; // Move right 4 bits


希望这会有所帮助

09-09 17:21