将2个字节统一为Int

Unify 2 bytes to Int

本文关键字:Int 2个 字节      更新时间:2023-10-16

我有一个函数,允许我在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;
            }
我的问题是:

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

要执行与int2bytes函数相反的操作,只需这样做:

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

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


你也错误地认为你可以把123123装进2个字节。2^16是65536

我有一个函数,允许我把一个int值分成2个字节(例如:int"123123"结果在E0F3;highByte= 0xF3 and lowByte=0xE0)

E0F3用十进制表示等于57587。这是你在评论中对我的回答所报告的价值。

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

Try

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

IMHO的hByte和lByte交换…更重要的是,123123不是一个两字节的值。Int是有符号的,所以两个字节的最大值是32767,但int(通常)是4字节。

我可能会建议在这种情况下使用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可以稍微改进一下

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;
相关文章: