我一直在阅读这篇关于网络包中位操作的博客。我有这个代码,我看到它以一个整数读取,通常为 4 字节长(32 位)
public int readInt() {
return (pData[caret++] & 0xff) << 24 | (pData[caret++] & 0xff) << 16
| (pData[caret++] & 0xff) << 8 | pData[caret++] & 0xff;
}
为什么我们在读取一个整数值时移动了 8、16 和 24?目标是什么?它实现了什么?
答案 0 :(得分:1)
那是因为 pData 是一个字节数组。 readInt() 的作用是将 4 个字节打包成一个整数,然后返回结果。因为一个整数是 4 个字节,所以 ((value & 0xFF) << 24)
将设置为第 1 个插槽,((value & 0xFF) << 16)
为第 2 个插槽,((value & 0xFF) << 8)
为第 3 个插槽和 {{1} } 对于最后一个插槽。并且要将这四个值合并为一个(在这种情况下是一个整数),必须在每个值之间执行按位 OR ((value & 0xFF)
)。如果 pData 确实是一个整数数组,那可能是因为它想使用无符号整数 (0 - 255)。所以 readInt() 所做的就是将每个 int(最多 4 个整数)的 8 个 LSB(最低有效位)打包成一个整数,然后返回结果。