2012-04-23 3 views
0

C++ Я пытаюсь преобразовать число HEX в короткий (2 байта) с использованием C++ всех КИ для одно ... подписал перехода от короткого замыкания на байты, за исключением (последний тест)подписал короткие байты в

я нашел этот вопрос и не мог извлечь из этого пользу: 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 
+1

Почему бы не использовать союз? –

+0

Что такое 'byte'? Это тип typedef? Если да, укажите его определение. –

ответ

9

ShortToByte От:

bytes[1] = num & 0xFF00; // high byte 

Вы должны переместить это направо 8 бит для результата, чтобы соответствовать в байте. В противном случае вы просто получите нули из нижней части.

+0

Большое спасибо @bop, это сработало – user1347945

6

Я бы сказал, что это было бы гораздо проще, используя союз:

union ShortByteUnion { 
    signed short asShort; 
    unsigned char asBytes[2]; 
}; 

Он заботится о конверсии для вас.

+0

Это тоже очень хороший трюк, и это сработало, спасибо – user1347945

0

Просто отбросьте массив байтов.

signed short test = 1234; 
byte* b; 

b = (byte*) &test; 

b[0];//one byte 
b[1];//another byte 

Это опасная вещь, чтобы сделать это на нескольких машинах, потому что endianess может отличаться.

Я не люблю остроты, но здесь они идут:

((byte*)&test)[0]; 
((byte*)&test)[1]; 
Смежные вопросы