Конвертировать байты в короткие или целые числа - PullRequest
3 голосов
/ 28 ноября 2010

У меня есть следующий код, который читает из сокета:

Int8     buffer[102400];
UInt8     *buffer_p = buffer;;
int       bytesRead;
bytesRead = CFReadStreamRead(stream, buffer, 102400); 

Сообщение, которое я ожидаю, начинается с короткого (2 байта) короткого (2 байта) целого числа (4 байта). Я не уверен, как преобразовать их в соответствующие типы.

Я попробовал следующее:

uint16_t zero16 = NTOHS(buffer_p);
buffer_p += sizeof(uint16_t);
uint16_t msg_id16 = NTOHS(buffer_p);
buffer_p += sizeof(uint16_t);
uint32_t length32 = NTOHL(buffer_p);
buffer_p += sizeof(uint32_t);

или

NSMutableData *data = [NSMutableData dataWithBytes:buffer length:bytesRead];

NSRange firstshort = {0,2};
NSRange secondshort = {2,2};
NSRange intrange = {4,4};
short zero;
[data getBytes:&zero range:firstshort];
short msgid;
[data getBytes:&msgid range:secondshort];
int length;
[data getBytes:&length range:intrange];

Но не работает. Заранее спасибо.

1 Ответ

9 голосов
/ 28 ноября 2010

Возможно, вы захотите посмотреть на OSByteOrder.h. Это определяет набор макросов, которые можно использовать для чтения различных целочисленных типов или для замены байтов. В частности, вы могли бы сделать что-то вроде

uint16_t zero16 = OSReadBigInt16(buffer_p, 0);
uint16_t msg_id16 = OSReadBigInt16(buffer_p, 2);
uint32_t length32 = OSReadBigInt32(buffer_p, 4);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...