有人可以帮我理解这段代码的用途。它看起来像是从一个位数组中生成一个整数。我不知道它是怎么做的。为什么有一个按位&对OxFF的操作? Inst这会产生相同的结果吗?
//first take the first 4 bytes read out of the socket into an array and
//make them a 32 bit integer
long ltemp =0;
long ltemp2 = 0;
ltemp = ltemp | (unsigned char)(analog_val_ptr[0] & 0xff);
ltemp = ltemp << 24;
ltemp2 = ltemp2 | (unsigned char)(analog_val_ptr[1] & 0xff);
ltemp2 = ltemp2 << 16;
ltemp = ltemp2 | ltemp;
ltemp2 =0;
ltemp2 = ltemp2 | (unsigned char)(analog_val_ptr[2] & 0xff);
ltemp2 = ltemp2 << 8;
ltemp = ltemp2 | ltemp;
ltemp = ltemp | (unsigned char)(analog_val_ptr[3] & 0xff);
///then convert that integer into a float, passing
答案 0 :(得分:3)
这是一种非常啰嗦的方式,只需将4个8位字节转换为32位长。
and
与0xff
只是确保只使用每个值的低8位(0xff == binary 11111111
)。
位移(以8的倍数表示)只是为了让每个字符都处于正确的位置。
整个事情可以用以下内容代替:
unsigned long ltemp = (unsigned char)(analog_val_ptr[0] & 0xff);
ltemp = (ltemp << 8) | (unsigned char)(analog_val_ptr[1] & 0xff);
ltemp = (ltemp << 8) | (unsigned char)(analog_val_ptr[2] & 0xff);
ltemp = (ltemp << 8) | (unsigned char)(analog_val_ptr[3] & 0xff);
或者,或者(假设它们可用),使用正确的工具,特别是htonl()
和ntohl()
。
答案 1 :(得分:1)
看起来它正在构建一个 bytes 数组中的整数。可能analog_val_ptr[]
是int
或short
值的数组,此代码旨在将每个条目视为一个字节。屏蔽是为了防止符号位泛滥目标变量。
答案 2 :(得分:1)
看起来它正在进行端点独立转换。
答案 3 :(得分:0)
var = 0x ? ? ? ? ? ? ? ?
& & & & & & & &
0x 0 0 0 0 0 0 f f
------------------
0 0 0 0 0 0 ? ?
AND运算后,低{8}位将与var & 0xff
一起找到。它只是削减所需的部分,掩盖。
上面的代码只是将4个数组元素的低字节粘贴到变量ltemp
中作为long int。