如何从一个字中提取2个字节,以及如何从2个字节(在C中)创建一个字?

时间:2013-02-21 01:10:35

标签: c byte word

我试图从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;

出于某种原因,我的代码没有按预期工作,现在我不确定单词的“分裂”是否错误,如果单词的“制作”错误,或者两者都是......你能给我一些建议吗?

5 个答案:

答案 0 :(得分:5)

分词时你不会转移。因此,如果grpix0x1234,则grpixl会获得预期的0x34,但grpixh最终会为0x1200。你应该说

byte grpixh = grpix >> 8;

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

答案 1 :(得分:2)

了解: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 );

我总是做一个&amp; 0xFF掩码,以确保我没有任何迹象问题。

答案 2 :(得分:0)

当你屏蔽高字节时,你还需要向下移8位,否则你最终得到一个16位数字,最后8位清零。

byte grpixh =(grpix&amp; 0xFF00)&gt;&gt; 8

使用or-equals代替plus-equals:

也可以提高您的构图效率

grpix | = grpixh&lt;&lt; 8

答案 3 :(得分:0)

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

word=(msb<<8)+lsb;

答案 4 :(得分: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;
}