C ++: как привести 2 байта в массиве к беззнаковому короткому - PullRequest
18 голосов
/ 19 ноября 2008

Я работал над унаследованным приложением C ++ и определенно за пределами моей комфортной зоны (что хорошо). Мне было интересно, если кто-нибудь там будет так любезен, чтобы дать мне несколько советов (каламбур).

Мне нужно привести 2 байта в массиве без знака к короткому без знака. Байты являются последовательными.

Для примера того, что я пытаюсь сделать:

Я получаю строку из сокета и помещаю ее в массив без знака. Я могу игнорировать первый байт, а затем следующие 2 байта должны быть преобразованы в беззнаковый символ. Это будет только на окнах, поэтому нет проблем Big / Little Endian (о которых я знаю).

Вот что у меня сейчас (очевидно, не работает):

//packetBuffer is an unsigned char array containing the string "123456789" for testing
//I need to convert bytes 2 and 3 into the short, 2 being the most significant byte
//so I would expect to get 515 (2*256 + 3) instead all the code I have tried gives me
//either errors or 2 (only converting one byte
unsigned short myShort;
myShort = static_cast<unsigned_short>(packetBuffer[1])

Ответы [ 11 ]

0 голосов
/ 19 ноября 2008

Никто не видел, что ввод был строкой!

/* If it is a string as explicitly stated in the question.
 */
int byte1 = packetBuffer[1] - '0'; // convert 1st byte from char to number.
int byte2 = packetBuffer[2] - '0';

unsigned short result = (byte1 * 256) + byte2;

/* Alternatively if is an array of bytes.
 */
int byte1 = packetBuffer[1];
int byte2 = packetBuffer[2];

unsigned short result = (byte1 * 256) + byte2;

Это также позволяет избежать проблем с выравниванием, которые могут возникнуть у большинства других решений на определенных платформах. Примечание. Сокращение составляет не менее двух байтов. Большинство систем выдаст вам ошибку памяти, если вы попытаетесь отменить ссылку на короткий указатель, который не выровнен на 2 байта (или какой бы ни был размер (короткий) в вашей системе)!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...