C++ 将C+中的24位整数(2s补码)转换为32位整数+;
bin是一个具有6字节记录的二进制文件。前三名 每个记录的字节包含纬度,最后3个字节包含 经度。每个24位值表示弧度乘以 0x1FFFF 这是我一直在做的任务。我多年来没有做C++,所以它比我想象的要长得多。在谷歌搜索之后,我看到了这个对我来说有意义的算法C++ 将C+中的24位整数(2s补码)转换为32位整数+;,c++,binary,byte,bit-shift,C++,Binary,Byte,Bit Shift,bin是一个具有6字节记录的二进制文件。前三名 每个记录的字节包含纬度,最后3个字节包含 经度。每个24位值表示弧度乘以 0x1FFFF 这是我一直在做的任务。我多年来没有做C++,所以它比我想象的要长得多。在谷歌搜索之后,我看到了这个对我来说有意义的算法 int interpret24bitAsInt32(byte[] byteArray) { int newInt = ( ((0xFF & byteArray[0]) << 16) |
int interpret24bitAsInt32(byte[] byteArray) {
int newInt = (
((0xFF & byteArray[0]) << 16) |
((0xFF & byteArray[1]) << 8) |
(0xFF & byteArray[2])
);
if ((newInt & 0x00800000) > 0) {
newInt |= 0xFF000000;
} else {
newInt &= 0x00FFFFFF;
}
return newInt;
}
int解释24bitasint32(字节[]byteArray){
int newInt=(
((0xFF和字节数组[0])
我不明白如何将字符“数据”存储到INT中
由于char
是一种数字类型,因此将它们组合成一个int
是没有问题的
因为它接收24个整数的信息存储到一个字节中
它是24位,不是字节,所以只需要组合三个整数值
在不使用条件的情况下生成相同结果的更简单方法如下:
int interpret24bitAsInt32(byte[] byteArray) {
return (
(byteArray[0] << 24)
| (byteArray[1] << 16)
| (byteArray[2] << 8)
) >> 8;
}
它还假设24位数字的最高有效字节存储在byteArray
的初始元素中,然后是中间元素,最后是最低有效字节
<符号>强>符号扩展注意:< /强>此代码通过在上三字节中构造值,然后将其移向右,而不是在右下三字节中构造值,自动地处理符号扩展。此额外的移位操作确保C++负责扩展结果的符号。us.当无符号字符被强制转换为int时,高阶位用0填充
当有符号字符被强制转换为强制转换的int时,符号位被扩展。
即:
因此,您的算法使用0xFF作为掩码来删除C'符号扩展,即
0xFF == 0x000000FF
0xABCDEF10 & 0x000000FF == 0x00000010
然后使用位移位和逻辑and将位放入正确的位置
最后检查最高有效位(newInt&0x00800000)>0
来决定是用0还是用1来完成最高字节。@SergeyA Oops,我确实复制粘贴了比需要更多的内容。谢谢!如果要从文件中读取24位2的补码小尾端有符号整数,在转换为int32_t?时,不需要对符号位进行位移位吗?@Heteperfan这是一个很好的观察,而不是k you.Sing扩展已经发生,因为右移>
操作。请参阅我在底部添加的注释。
int32_t interpret24bitAsInt32(const std::array<uint8_t,3> byteArray) {
return (
(const_cast<int32_t>(byteArray[0]) << 24)
| (const_cast<int32_t>(byteArray[1]) << 16)
| (const_cast<int32_t>(byteArray[2]) << 8)
) >> 8;
}
int x;
char y;
unsigned char z;
y=0xFF
z=0xFF
x=y;
/*x will be 0xFFFFFFFF*/
x=z;
/*x will be 0x000000FF*/
0xFF == 0x000000FF
0xABCDEF10 & 0x000000FF == 0x00000010