подписан коротким байтом в c ++

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

я нашел этот вопрос и не смог извлечь из него пользу:переносимое байтовое преобразование со знаком / без знака, C ++

here are my tests:

<code>// 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;
</code>

functions used:

<code>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
}
</code>

outputs:

<code>16
-16
11
245
</code>
 Richard J. Ross III23 апр. 2012 г., 22:55
Почему бы не использовать союз?
 Robᵩ23 апр. 2012 г., 23:04
Что такоеbyte? Этоtypedef тип? Если это так, пожалуйста, включите его определение.

Ответы на вопрос(3)

что это было бы намного проще, если бы использовать профсоюз:

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

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

 user134794523 апр. 2012 г., 23:26
это тоже очень хороший трюк, и это сработало, спасибо

signed short test = 1234;
byte* b;

b = (byte*) &test;

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

Это опасно делать на более чем одном типе машин, потому что бесконечность может варьироваться.

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

((byte*)&test)[0];
((byte*)&test)[1];
Решение Вопроса

ОтShortToByte:

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

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

 user134794523 апр. 2012 г., 23:15
большое спасибо @bop, это сработало

Ваш ответ на вопрос