bytearray — Как извлечь отдельные поля из байтового массива (который находится в BIG-ENDIAN) в переполнении стека

Я пытаюсь прочитать пару байтов из byteData как упомянуто ниже в моем коде C ++. Фактическое значение в пределах byteData является байтовым массивом двоичных двоичных объектов в формате BIG-ENDIAN. Поэтому я не могу просто «привести» массив байтов в строку.

byteData байтовый массив состоит из этих трех вещей —

First is `schemaId` which is of two bytes (short datatype in Java)
Second is `lastModifiedDate` which is of eight bytes (long datatype in Java)
Third is the length of actual `byteArray` within `byteData` which we need from `byteData`.
Fourth is the actual value of that `byteArray` in `byteData`.

Сейчас я пытаюсь извлечь вышеуказанную конкретную информацию из byteData в C ++ … Как-то я могу извлечь schemaId но ценность, которая прибывает, неправильна .. И я не уверен, как извлечь другие вещи из этого …

uint16_t schemaId;
uint64_t lastModifiedDate;
uint16_t attributeLength;
const char* actual_binary_value;

while (result.next()) {
for (size_t i = 0; i < result.column_count(); ++i) {
cql::cql_byte_t* byteData = NULL;
cql::cql_int_t size = 0;
result.get_data(i, &byteData, size);

if (!flag) {

// I cannot just "cast" the byte array into a String
// value = reinterpret_cast<char*>(byteData);

// now how to retrieve schemaId, lastModifiedDate and actual_binary_value from byteData?

schemaId = *reinterpret_cast<uint16_t*>(byteData);

flag = false;
}
}

// this prints out 65407 somehow but it should be printing out 32767
cout<< schemaId <<endl;
}

Если кто-то должен увидеть мой код Java, то это мой код Java —

    byte[] avroBinaryValue = text.getBytes();

long lastModifiedDate = 1289811105109L;
short schemaId = 32767;

int size = 2 + 8 + 4 + avroBinaryValue.length; // short is 2 bytes, long 8 and int 4

ByteBuffer bbuf = ByteBuffer.allocate(size);
bbuf.order(ByteOrder.BIG_ENDIAN);

bbuf.putShort(schemaId);
bbuf.putLong(lastModifiedDate);
bbuf.putInt(avroBinaryValue.length);
bbuf.put(avroBinaryValue);

// merge everything into one bytearray.
byte[] bytesToStore = bbuf.array();

Hex.encodeHexString(bytesToStore)

Кто-нибудь может мне помочь, что я делаю неправильно в своем коде C ++ и почему я не могу правильно извлечь schemaId из него и других полей?

Обновить:-

После использования этого —

schemaId = ntohs(*reinterpret_cast<uint16_t*>(data));

Я начал правильно возвращать значение для schemaId.

Но теперь, как извлечь другие вещи, такие как lastModifiedDateдлина фактического byteArray withinbyteDataand actual value of thatByteArray,inbyteData`.

Я использовал это для lastModifiedDate но это не работает как-то …

std::copy(reinterpret_cast<uint8_t*>(byteData + 2), reinterpret_cast<uint8_t*>(byteData + 10), lastModifiedDate);

0

Решение

32767 — это 0x7fff. 65407 — это 0xff7f. Обратите внимание, что старшие и младшие байты поменялись местами. Вам нужно поменять эти байты, чтобы восстановить исходное значение числа. К счастью, есть макрос или функция с именем ntohs (сеть для размещения коротких), которая делает именно то, что вы хотите. Является ли это макросом или функцией и в каком заголовке он определен, зависит от вашей системы. Но имя макроса / функции всегда ntohsнезависимо от того, используете ли вы Windows, Linux, Sun или Mac.

На машине с прямым порядком байтов этот макрос или функция заменяет два байта, которые образуют 16-битное целое число. На машине с прямым порядком байтов этот макрос / функция ничего не делает (что именно то, что нужно). Обратите внимание, что большинство домашних компьютеров в настоящее время имеют порядок байтов.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]