1

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

char *buf=new char[4];
// 00000010 00000000 (.. other stuff ..)

我想要做的是用最重要的字节切换最少,并将该值存储在一个变量中。尝试这样做如下:

short len=buf[1];
len <<= 8;
len |= buf[0];
    // Result, as expected: 00000000 00000010

它工作得很好,除非最高有效字节 (buf[0]) >= 128,这使得 or 运算符 (|) 用 1 填充短的一半。例子:

Original: 10000110 00000000
Should be: 00000000 10000110
But is: 11111111 10000110

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

4

3 回答 3

6

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

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

unsigned short len=buf[1];
len <<= 8;
len |= buf[0];
于 2013-07-16T11:25:02.553 回答
0
 buff = 11001010 01011100;
 //copy this buff, I am writing it directly below  

 copy_of_buff = 11001010 01011100;  
 buff_hi = (buff >> 8);  //Hence after this exec, buff_hi = 00000000 11001010  
 buff_lo = (copy_of_buff << 8); //Hence after this exec, buff_lo = 01011100 00000000

 out_buff = (buff_hi)||(buff_lo); //Hence after this exec, out_buff = 01011100 11001010  
于 2013-07-16T11:49:02.937 回答
0

尝试这个:

unsigned short buf;
...
buf = buf << 8 | buf >> 8;

或者只是执行一个排列:

char buf[2];
char tmp;
...
tmp = buf[0];
buf[0] = buf[1];
buf[1] = tmp;

我希望这有帮助!

于 2013-07-16T11:39:25.253 回答