按位切换最重要和最不重要的字节

gca*_*dal 1 c c++ bit-manipulation

假设我有一个存储2个字节的缓冲区:

char *buf=new char[4];
// 00000010 00000000 (.. other stuff ..)
Run Code Online (Sandbox Code Playgroud)

我想要做的是用最重要的字节切换最少的字节,并将该值存储在变量中.试着按如下方式这样做:

short len=buf[1];
len <<= 8;
len |= buf[0];
    // Result, as expected: 00000000 00000010
Run Code Online (Sandbox Code Playgroud)

它可以处理罚款,除非最重要的字节(buf [0])> = 128,这使得或运算符(|)用1填充短的一半.例:

Original: 10000110 00000000
Should be: 00000000 10000110
But is: 11111111 10000110
Run Code Online (Sandbox Code Playgroud)

谢谢(哦,我正在用file.read(...,4)从文件中读取字节; - 如果这是相关的话,甚至不知道了)

Arm*_*yan 6

您的实现显然使用带符号数的二进制补码表示.请改用无符号值

unsigned char * buf = new unsigned char[2];
...

unsigned short len=buf[1];
len <<= 8;
len |= buf[0];
Run Code Online (Sandbox Code Playgroud)

  • 如果`char`签名,那将无济于事; `buf [0]`在`| =`被提升为`int`时仍然会被符号扩展.您需要更改`buf`的类型,而不是`len`,以防止符号扩展. (2认同)