对于网络应用程序,我需要一个有符号的 2 的补码整数。具有自定义宽度。在运行时指定。假设整数的值落在宽度上。
我遇到的问题是奇偶校验位。有什么方法可以避免手动设置奇偶校验位?假设我有一个宽度为 11 位的整数,我会将其存储在 2 个字符的数组中,如下所示:
int myIntWidth = 11;
int32_t myInt= 5;
unsigned char charArray[2] = memcpy(charArray, &myInt, (myIntWidth + 7)/8);
对于网络应用程序,我需要一个有符号的 2 的补码整数。具有自定义宽度。在运行时指定。假设整数的值落在宽度上。
我遇到的问题是奇偶校验位。有什么方法可以避免手动设置奇偶校验位?假设我有一个宽度为 11 位的整数,我会将其存储在 2 个字符的数组中,如下所示:
int myIntWidth = 11;
int32_t myInt= 5;
unsigned char charArray[2] = memcpy(charArray, &myInt, (myIntWidth + 7)/8);
它不是那样工作的。它不起作用,因为您从 myInt 的开头复制两个字节,但您不知道您感兴趣的字节存储在哪里。您还需要知道应该以什么顺序存储字节。根据这一点,使用以下两个代码之一:
unsigned char charArray [2];
charArray [0] = myInt & 0xff; // Lowest 8 bits
charArray [1] = (myInt >> 8) & 0x07; // Next 3 bits
或者
unsigned char charArray [2];
charArray [1] = myInt & 0xff; // Lowest 8 bits
charArray [0] = (myInt >> 8) & 0x07; // Next 3 bits
在上面很多帖子的帮助下,我想出了这个解决方案:
inline void reduceSignedIntWidth(int32_t& destInt, int width)
{
//create a value mask, with 1's at the masked part
uint32_t l_mask = (0x01u << width) - 1;
destInt &= l_mask;
}
它将返回减少的 int,以零作为填充。