Endianness: битовая арифметика - реализовать простой функционал

3 000 руб. за проект
08 марта 2020, 23:31 • 3 отклика • 48 просмотров
Все привет,

Допустим есть строка: char buff[16] и она заполнена рандомными данными

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

typedef struct __attribute__((packed)) {
unsigned ndays : 14;
unsigned camid : 10;
} pseudo_rand_t;


затем сделать так и изменить первый три байта - такой манипуляцией:

pseudo_rand_t* ps = (pseudo_rand_t*) buff;
ps->ndays = 1234;
ps->camid = 321;


// теперь в buff у меня будет не 16 рандомных байт, а только 13

это прекрасно работает, но только вот Endianness (у меня ARM64) и я получаю немного другой результат: и я хочу чтобы при увеличении на единицу ndays, сначала менялись младшие байты (биты), а не старшие в итоговом массиве

сейчас:
R(0) = 0b 40 00 00 ff 9f 22 b4 02 36 90 09 05 49 4c c3
R(1) = 0c 40 00 00 ff f9 66 b5 0f 8e c1 40 66 0d 7d 5a
R(2) = 0d 40 00 00 ff d4 b1 2c 47 88 11 88 2d ef 50 cc

надо:
R(0) = 00 0b dc 76 85 1b 9b 74 04 0d 5a a1 8e f2 8d f2
R(1) = 00 0c 52 9c 26 bf 84 cc 02 30 d4 60 b0 5e 39 f1
R(2) = 00 0d cf 17 c8 78 63 8e a7 4b bc 45 30 98 eb 02

// просто пример, не соответствует ndays=1234


мне нужно изящное и красивое решение, C++11

Комментарии:

1. "Младшие байты в итоговом массиве -- байты начинающиеся с 0 индекса или с 15 индекса?"
Применительно к этой моей неудачной формулировке - выше есть примеры "сейчас/надо", там это отображено, мы меняем только байты [0;2], при увеличении на единицу - "сначала должно меняться справа" как-то так

2. А зачем виртуалка с ARM64, если x86 тоже little-endian?
Отзывы
Avatar r50 a6ce93fe35b158fd29ba0e8681c918c22117160e9586a56eee4ffbc20df9bda1
Заказчик
Хотя моя задача и была довольно простой, а доволен, а решена она была быстро. Спасибо!
5 лет назад
R50 b2655fc2b4e67961b27e069fdc6707ac
Фрилансер
Антон понимает, что хочет, понимает, для чего это ему нужно. Готов обменять деньги на результат, даже если работа кажется простой. Буду рад сотрудничать вновь.
5 лет назад