Кто покритикует? Где может потом вылезти проблема, и может ли? Передаю многобайтовые переменные через однобайтовый буфер. send_status_packet(const uip_ip6addr_t *dest_addr, struct simple_udp_connection *connection, uip_ipaddr_t *parent_addr, uint32_t *uptime, int16_t rssi_parent) { uint8_t *uptime_uint8_t = (uint8_t *)uptime; uint8_t *rssi_parent_uint8_t = (uint8_t *)&rssi_parent; uint8_t buf[23]; .... buf[9] = ((uint8_t *)parent_addr)[14]; buf[10] = ((uint8_t *)parent_addr)[15]; buf[11] = *uptime_uint8_t++; buf[12] = *uptime_uint8_t++; buf[13] = *uptime_uint8_t++; buf[14] = *uptime_uint8_t++; buf[15] = *rssi_parent_uint8_t++; buf[16] = *rssi_parent_uint8_t++;

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

  1. Lexszero

    я бы сделал макросы пакующие многобайтные инты с учетом остро/тупоконечности машины если планируется это переносить. чтоб итоговый код в итоге был в духе ptr = buf; ... PUSH_UINT32(ptr, uptime) PUSH_UINT16(ptr, rssi_parent) а еще я не очень понял, зачем ты uptime передаешь указателем.

    • Dolphin

      хотя префиксное только в скобках, автоматом отпадает УБ он его на байты так режет

      • Vvzvlad

        очень надеюсь, что ЭТО не на другой арм переноситься не будет

        • Lexszero

          #define PUSH_UINT32(ptr, x) do { ptr[0] = x & 0xFF; ptr[1] = (x >> 8) & 0xFF; ptr[2] = (x >> 16) && 0xFF; ptr[3] = (x >> 24) && 0xFF; ptr += 4; } while (0) как-то так

          • Vvzvlad

            указатель забыл убрать.

          • Dmitry

            *ptr = x; не?

            • Dolphin

              PUSH_UINT32(ptr, x) do { ptr[0] = x & 0xFF; ptr[1] = (x » 8) & 0xFF; ptr[2] = (x » 16) & 0xFF; ptr[3] = (x » 24) ; ptr += 4; } while (0)

              • Vvzvlad

                из этих сорцов нет, оно платформо-зависимое очень.

              • Alexey

                А зачем делать do {<...>} while(0)?

            • Lexszero

              ptr это пойнтер на однобайт, x четырехбайтный. без кастов будет ой, с кастами - получится вариант оп'а. так делать можно, но не очень кошерно.

              • Vvzvlad

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

              • Dmitry

                А,лол. А что мешает поинтер сделать на нормальные 32 бита?

                • Lexszero

                  ну, например, то что паковать надо кашу из полей разной длины?

                  • Kirill

                    если си, я бы пиханул мемкопи с инкрементом на sizeof. если плюсы, я бы пиханул вариадик темплейтс вместие с мемкопи и все бы сериализовалось автоматически

        • Lexszero

          а если потребуется какие-нибудь отладочные утилиты для x86 из тех же сорцов/хедеров собрать? по-моему это довольно частый юзкейс

Не нашли ответ?

Вам также может быть интересно