Javascript 24位无符号整数
我开始使用HART(公路可寻址远程传感器)协议,我发现了一些东西,可以说是不同的,我试图理解它,更准确地说是uint24。据我所知,该结构在内部使用UInt32进行存储和大多数其他常见的预期整数功能,因此使用24位整数不会节省内存。但我的问题是如何将UInt32转换为这种特定类型,我在Javascript中找到了这些代码行,但我不知道这些左移的目的是什么Javascript 24位无符号整数,javascript,c++,c,byte,bit-shift,Javascript,C++,C,Byte,Bit Shift,我开始使用HART(公路可寻址远程传感器)协议,我发现了一些东西,可以说是不同的,我试图理解它,更准确地说是uint24。据我所知,该结构在内部使用UInt32进行存储和大多数其他常见的预期整数功能,因此使用24位整数不会节省内存。但我的问题是如何将UInt32转换为这种特定类型,我在Javascript中找到了这些代码行,但我不知道这些左移的目的是什么 var getUint24 = function(bytes) { return (DataView(bytes.buffer).ge
var getUint24 = function(bytes)
{
return (DataView(bytes.buffer).getUint16(0) << 8) + DataView(bytes.buffer).getUint8(0 + 2);
}
如果有人能帮助我理解这些转变的目的,我将不胜感激,而且非常欢迎C/C++版本。简短回答
- 左
移位是将值段提取为较小数据类型的一部分(在应用掩码之后)李>
1011
。我们只能通过2位帧读取它:[10],[11]
假设我们从左到右读取流
# offset 0 bits
a = stream(0) # a = 10
a << 2 # a = 1000
b = stream (2) # b = 11
return a + b # 1000 + 11 = 1011
同样地,字节。缓冲区可以将值保留为[XY,Z]
或[Z,XY]
。getUintX(偏移量)
对我们隐藏了这些细节。但是,如果您想编写自己的转换器,则需要研究您的案例中的格式
ToBytesInt32BigEndian示例
这里我们看到了包装值的另一个关注点——应用掩码
例如,我们有32位值AB CD EF 12
。我们可以应用掩码来提取所需的值段
例如,如果我们有3位值011
并且想要获得第二位的值,我们需要应用&-mask,其中根据1
计算的主题位保持原始值,而根据0
计算的其余位将任何值转换为0
masked = 011 & 010 # 010
bit_value = masked >> 1 # 001
与我们的ABCDEF12
x = 0xABCDEF12 & 0xFF000000 # x = 0xAB000000
x >> 24 # x = 0x000000AB
...
这样我们将得到数组[0xAB,0xCD,0xEF,0x12]
。在不移位的情况下,我们得到的数组[0xAB000000,0x00CD0000,0x0000EF00,0x00000012]
不是我们想要的。通常无符号整数作为其十六进制表示形式存储在内存中(对于其他类型来说非常不同)。左/右移位只是将字节的某些位置向左/右“移动”,用零填充新的孔,并丢失移出的字节。移动到最右边的位置会给您一个唯一的字节。与&
一起使用的遮罩只需选择一些位置,其余位置归零。
masked = 011 & 010 # 010
bit_value = masked >> 1 # 001
x = 0xABCDEF12 & 0xFF000000 # x = 0xAB000000
x >> 24 # x = 0x000000AB
...