2016-11-08 5 views
1

У меня есть 4 байта данных (сохраненных как unsigned int), которые я хотел бы использовать.Преобразование буфера в unsigned int и использование битовой маски

Если это 1 байт данных, это была решена с помощью:

//Java 

buffer.get() & 0xFF 

//Objective-C 

uint32_t buffer; 
[data getBytes:&buffer range:NSMakeRange(2, 1)]; 
uint32_t payloadLength = buffer & 0xFFu; 
//data = d1021b53 
//buffer = 897307; payloadLength: 27 

В Java для 4 байт, это было сделано с помощью:

//Java 

buffer.getInt() & 0xFFFFFFFFL 

//Current not working Objective-C code 
uint32_t buffer; 
[data getBytes:&buffer range:NSMakeRange(2, 4)]; 
uint32_t payloadLength = CFSwapInt32BigToHost(buffer); 
//data: 0103940f b7626361 
//buffer = 1656164244; payloadLength: 2484057954 (should be = ~80) 

Для объективно- C/C, мне трудно работать с 4 байтами и битмашками.

У кого-нибудь есть справка?

ответ

1

Чтобы преобразовать 4 байта в целое число, вы можете сделать что-то подобное вашему 1-байтовому коду, но вы должны иметь дело с порядком endian - вам нужно знать, какой путь вокруг 4 байта хранится, низкий или высокий байт первый.

Так начните с буфером 4-байтовый:

uint32_t buffer; // or use int32_t if signed 

Копировать байты:

[data getBytes:&buffer range:NSMakeRange(0, 4)]; 

И конвертировать порядок байтов в порядке хоста. Если данные большие младшему сделать:

uint32_t payloadLength = CFSwapInt32BigToHost(buffer); 

или если его немного младшему:

uint32_t payloadLength = CFSwapInt32LittleToHost(buffer); 

, и вы сделали.

+0

У меня не было радости, используя это. Я изменил оригинал, чтобы отразить изменение примера с объектами-c 1 байтом, чтобы использовать unsigned int (как и должно быть). Когда я пытаюсь использовать CFSwapInt32BigToHost (или Little) с 4-байтовым значением, результат непонятен. Даже использование этого примера 1 байта не работает. Любые другие предложения о том, как копировать битовую маску java 0xFFFFFFFF? –

+0

В этом случае нет необходимости использовать битовую маску. Можете ли вы отредактировать свой вопрос (поскольку написание кода в комментарии на самом деле не работает), покажите код, который вы теперь используете на основе этого ответа, и включите результаты 'NSLog (@"% @ \ n% 8x \ n% 8x ", data, buffer, payloadLength)'? (вырезать часть дампа 'data', если он длинный!) – CRD

+0

Я отредактировал сообщение, чтобы показать примерные значения, и показать, что это сейчас, что не работает. –