0

我有一个函数允许我将 INT 值分隔为 2 个字节(例如: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;
            }

我的问题是:

如何将这 2 个字节转换(统一)为一个等于“123123”的 INT?

4

2 回答 2

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。这是您在对我的回答所做的评论中报告的值。

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

于 2013-05-06T22:08:29.390 回答
0

尝试

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

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

我可能会建议union在这种情况下使用 a ,因为您可以节省所有算术并且根本不需要使用显式转换。

使用联合的示例代码:

#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;
于 2013-05-06T22:22:27.950 回答