Переинтерпретировать байты буфера в соответствии с системным (родным) порядком байтовC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Переинтерпретировать байты буфера в соответствии с системным (родным) порядком байтов

Сообщение Anonymous »

Я получаю данные от другого хоста через сетевой сокет в формате с прямым порядком байтов. Как интерпретировать байты, полученные в собственном формате с порядком байтов (например, получить представление или повторно интерпретировать эти байты) без копирования во временную переменную.
#include
#include

struct A {
uint16_t msg_id;
// contains many other fields where total size is greater than 4096

void print() const {
// print all the fields of struct A
}
};

struct B {
uint16_t msg_id;
// contains many other fields where total size is greater than 4096

void print() const {
// print all the fields of struct B
}
};

struct C {
uint16_t msg_id;
// contains many other fields where total size is greater than 4096

void print() const {
// print all the fields of struct C
}
};

int main() {
char buff[8192];
while (true) {
// data is received in network byte order (big endian) but my system is little endian
const auto recvd_len = recvfrom(sock_fd, buff, sizeof(buff), 0, nullptr, nullptr);
const uint16_t msg_id = (buff[0] print();
// the above print call works correctly only if my system is big endian but not little endian
}

break;

case 0x0002: {
// reinterpret the bytes received as struct B, copy elision
const B* b_obj = reinterpret_cast(buff);
b_obj->print();
// the above print call works correctly only if my system is big endian but not little endian
}

break;

case 0x0003: {
// reinterpret the bytes received as struct C, copy elision
const C* c_obj = reinterpret_cast(buff);
c_obj->print();
// the above print call works correctly only if my system is big endian but not little endian
}

break;

default:
break;
}
}
}


Подробнее здесь: https://stackoverflow.com/questions/785 ... -endianess
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»