Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将C+中的24位整数(2s补码)转换为32位整数+;_C++_Binary_Byte_Bit Shift - Fatal编程技术网

C++ 将C+中的24位整数(2s补码)转换为32位整数+;

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) |

bin是一个具有6字节记录的二进制文件。前三名 每个记录的字节包含纬度,最后3个字节包含 经度。每个24位值表示弧度乘以 0x1FFFF

这是我一直在做的任务。我多年来没有做C++,所以它比我想象的要长得多。在谷歌搜索之后,我看到了这个对我来说有意义的算法

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