我有一个允许我以2字节分隔INT值的函数
(例如:INT" 123123"结果为E0F3; highByte= 0xF3
和lowByte=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"?
答案 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.您在我对答案的评论中报告的值是多少。
现在,以十六进制表示的123123
为0x1E0F3
,您需要至少三个字节来存储该值。
答案 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;