将2个字节统一为Int

时间:2013-05-06 22:01:49

标签: c++

我有一个允许我以2字节分隔INT值的函数 (例如:INT" 123123"结果为E0F3; highByte= 0xF3lowByte=0xE0

使用:

void int2bytes(unsigned char dest[2],int val){
             int hByte=0;
             int lByte=0;

             hByte=val&0XFF;
             lByte=val>>8;

             dest[0]= (char)hByte;
             dest[1]= (char)lByte;
            }

我的问题是:

如何将这两个字节转换(统一)为一个INT等于" 123123"?

2 个答案:

答案 0 :(得分:3)

要执行功能int2bytes的反向操作,您只需执行以下操作:

int val = (lByte << 8) | hByte;

虽然,我认为你的变量名称是从前到后的。我将val&0xff称为低字节,将val >> 8称为高字节。


你也错了,假设你可以将123123放入2个字节。请记住,2 ^ 16是65536

  

我有一个函数允许我将一个int值分成2个字节(例如:int“123123”结果为E0F3; highByte = 0xF3和lowByte = 0xE0)

嗯,以十进制表示的E0F3等于57587.您在我对答案的评论中报告的值是多少。

现在,以十六进制表示的1231230x1E0F3,您需要至少三个字节来存储该值。

答案 1 :(得分:0)

尝试

(dest[1] << 8) & dest[0]

恕我直言,hByte和lByte被交换......而更多123123不是一个双字节值。 Int是有符号的,所以在两个字节上最大值是32767,但是int(通常)是4个字节。

我可能建议在这种情况下使用union,因为你可以省去所有的算术,而你根本不需要使用显式转换。

使用union的示例代码:

#include <iostream>
using std::cout;
using std::hex;
using std::dec;
using std::endl;

int main() {
   union int2bytes {
       unsigned char byte[sizeof(int)];
       int val;
   };

   int2bytes i;
   // Convert int to byte
   i.val = 123123;
   cout << i.val << " : " << hex << i.val << dec << endl;
   for (int j = 0; j < sizeof(int); ++j)
       cout << "Byte#" << j << " : " << hex << (int)i.byte[j] << dec << endl;

   // Convert byte to int
    i.byte[1]--;
    cout << i.val << " : " << hex << i.val << dec << endl;
}

输出:

123123 : 1e0f3
Byte#0 : f3
Byte#1 : e0
Byte#2 : 1
Byte#3 : 0
122867 : 1dff3

联盟可以改善一点

union int2bytes {
    unsigned char byte[sizeof(int)];
    int val;
    int2bytes (const int2bytes& i = 0) : val(i.val) {};
    int2bytes (int i) : val(i) {};
};

现在这些工作

int2bytes i = 123123;
int2bytes j; // j.val == 0
int2bytes k = i;
j = i;