2

我试图从一个 16 位字中提取两个字节,并从两个字节中生成一个 16 位字。这是我尝试过的(byte = unsigned char, word = unsigned short):

将 grpix 字拆分为 2 个字节:

word grpix; // Assume that the value has been initialized

byte grpixl = grpix & 0x00FF;
byte grpixh = grpix & 0xFF00;

从 2 个字节制作 grpix 字

byte grpixh; // Assume that the value has been initialized
byte grpixl; // Assume that the value has been initialized

word grpix = grpixh;
grpix <<= 8;
grpix += grpixl;

出于某种原因,我的代码没有按预期工作,现在我不确定单词的“拆分”是否错误,单词的“制作”是否错误,或两者兼而有之......你能给我有什么建议吗?

4

5 回答 5

5

当您拆分单词时,您并没有转移。因此,如果grpix0x1234,则grpixl得到预期0x34grpixh最终为0x1200。你应该说

byte grpixh = grpix >> 8;

当然,您也忽略了可能存在的任何字节顺序问题。htons()您可能应该在尝试拆分之前将您的单词转换为已知的字节序(使用类似的东西)(并在加入时进行反向转换)。

于 2013-02-21T01:15:35.553 回答
4

了解:http ://graphics.stanford.edu/~seander/bithacks.html进行各种操作。

right_byte = short_val & 0xFF;
left_byte = (short_val >> 8) & 0xFF

short_val = ( (left_byte & 0xFF) << 8) | (right_byte & 0xFF);

我总是做一个 &0xFF 掩码以确保我没有符号问题。

于 2013-02-21T01:21:18.833 回答
0

当你屏蔽高字节时,你还需要向下移动 8 位,否则你只会得到一个 16 位的数字,而后八位被清除。

字节 grpixh = (grpix & 0xFF00) >> 8

此外,通过使用 or-equals 而不是 plus-equals,您的作文可以更有效:

grpix |= grpixh << 8

于 2013-02-21T01:16:25.873 回答
0

我用来解决这个问题的简单代码是:

word=(msb<<8)+lsb;
于 2019-01-10T07:56:43.043 回答
0

以下例程对我来说非常可靠:-

unsigned short get16int(a) char *a;{
   unsigned short hi,lo;
   hi = *a++ << 8;
   lo = *a  & 0x00ff; /* Needed to cater for sign extending when msb bit is set */
   return (hi | lo);
}
put16int(a,i) char *a; int i;{
 *a++ = i >> 8;
 *a = i;
}
于 2020-04-24T09:21:21.717 回答