Я полагаю, что вы имеете в виду методы Java ByteBuffer.
Обратите внимание, что если вы работаете с одними и теми же данными, обрабатываемыми этими функциями, то Java всегда имеет БОЛЬШОЙ порядковый номер независимо от порядка байтов собственного хоста .Если вы точно не знаете, что это не так, ваш код C , вероятно, компилируется для запуска на LITTLE endian машине.Некоторые грубые рекомендации, если вы не уверены: x86 (большинство компьютеров) - это LE.ARM может быть и другим, но обычно LE.PowerPC и Itanium - это БЫТЬ.
Кроме того, никогда не разыменовывайте char *
или void *
для любого типа размером больше 1 байта, если только вы не знаете, что он правильно выровнен.Это приведет к ошибке шины или аналогичной ошибке, если это не так.
Таким образом, здесь будет мой getInt()
impl, предполагающий буфер порядка байтов BE / сети (например, созданный Java).Приношу свои извинения за краткость.
typedef struct ByteBuffer {
const char * buffer; /* Buffer base pointer */
int nextByte; /* Next byte to parse */
int size; /* Size of buffer */
} ByteBuffer_t;
/* Get int from byte buffer, store results in 'i'. Return 0 on success, -1 on error */
int getInt(ByteBuffer * bb, int * i) {
const char * b;
if( (bb->nextByte + 3) < bb->size ) {
b = &(bb->buffer[bb->nextByte]);
/* Read as big-endian value */
*i = (b[0] << 24) | (b[1] << 16) | (b[2] << 8) | b[0];
bb->nextByte += 4;
return 0;
} else {
return -1;
}
}
void test(const char * buf, int bufSize) {
ByteBuffer_t bb;
int ival;
bb.buffer = buf;
bb.size = bufSize;
bb.nextByte = 0;
while(1) {
if( 0 == getInt(&bb, &ival) )
printf("%d\n", ival);
else
break;
}
}
РЕДАКТИРОВАТЬ: Удален вызов ntohl () .... он не принадлежал, если ваши исходные данные были действительно с прямым порядком байтов.Если это сработало с этим вызовом, вам, вероятно, нужно поменять порядок байтов в пакете shift, что означает, что вместо этого он будет анализировать байтовые потоки с прямым порядком байтов.