我试图从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;
出于某种原因,我的代码没有按预期工作,现在我不确定单词的“分裂”是否错误,如果单词的“制作”错误,或者两者都是......你能给我一些建议吗?
答案 0 :(得分:5)
分词时你不会转移。因此,如果grpix
为0x1234
,则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;
}