我正在尝试使用C ++将十六进制数转换为短数(2字节) 一切都没问题,除了一件事......签名转换从简短转换为字节(最后一次测试)
我发现了这个问题并且无法从中受益:portable signed/unsigned byte cast,C++
这是我的测试:
// test 1 - positive B2Short (success)
byte *b = new byte[2];
b[0] = 0x10; //low byte
b[1] = 0x00; //heigh byte
signed short test = 0;
test = ByteToShort(b);
cout << test << endl;
// test 2 - negative B2Short (success)
b[0] = 0xF0; //low byte
b[1] = 0xFF; //heigh byte
test = 0;
test = ByteToShort(b);
cout << test << endl;
// test 3 - positive Short2B (success)
signed short n = 11;
ShortToByte(n, b);
test = ByteToShort(b); // for display to see if it worked
cout << test << endl;
// test 4 - negative Short2B (FAIL!)
n = -11;
ShortToByte(n, b);
test = ByteToShort(b); // for display to see if it worked
cout << test << endl;
使用的功能:
signed short ByteToShort(byte* bytes){
signed short result = 0;
result = (result<<8) + bytes[1]; // heigh byte
result = (result<<8) + bytes[0]; // low byte
return result;
}
void ShortToByte(signed short num, byte* bytes){
bytes[1] = num & 0xFF00; // heigh byte
bytes[0] = num & 0x00FF; // low byte
}
输出:
16
-16
11
245
答案 0 :(得分:9)
来自ShortToByte
:
bytes[1] = num & 0xFF00; // high byte
您必须将此位移到右侧8位才能使结果适合一个字节。否则你只会从低部分得到零。
答案 1 :(得分:7)
我会说使用联盟会更容易:
union ShortByteUnion {
signed short asShort;
unsigned char asBytes[2];
};
它会照顾你的转换。
答案 2 :(得分:0)
只需将短数组转换为字节数组。
signed short test = 1234;
byte* b;
b = (byte*) &test;
b[0];//one byte
b[1];//another byte
在多种类型的机器上执行此操作是危险的,因为结束可能会有所不同。
我不喜欢单行,但他们去了:
((byte*)&test)[0];
((byte*)&test)[1];