C ++: Как читать и записывать многобайтовые целочисленные значения независимо от платформы? - PullRequest
1 голос
/ 06 июня 2011

Я разрабатываю простой протокол, который используется для чтения / записи целочисленных значений из / в буфер.Подавляющее большинство целых чисел меньше 128, но возможны гораздо большие значения, поэтому я смотрю на некоторую форму многобайтового кодирования для краткого хранения значений.

Что является самым простым и быстрымспособ чтения / записи многобайтовых значений независимым от платформы (т. е. независимым от порядка байтов) способом?

Ответы [ 5 ]

3 голосов
/ 06 июня 2011

XDR формат может помочь вам в этом. Если бы мне пришлось суммировать это в одном предложении, это был бы бинарный код UTF-8 для целых чисел.

Редактировать: Как упоминалось в моем комментарии ниже, я "знаю" XDR, потому что я использую несколько функций, связанных с XDR, в моей офисной работе. Только после вашего комментария я понял, что формат "упакованного XDR", который я использую каждый день, даже не является частью официальных документов XDR, поэтому я опишу его отдельно.

Идея такова:

  • проверять старший значащий бит байта.
    • Если это 0, этот байт равен значению.
    • если это 1, следующие три бита дают «количество байтов», то есть количество байтов в значении.
      • замаскируйте верхний клочок (бит флага и число байтов), объедините соответствующее количество байтов, и вы получите значение.

Понятия не имею, является ли это «реальным» форматом или мой (бывший) коллега создал его сам (именно поэтому я не публикую код).

2 голосов
/ 06 июня 2011

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

  • указание длины
  • маркер конца

Вы, очевидно, делаете слияние с некоторыми битами значения.

  • Для указания длины, которая даст вам что-то, где длина и некоторые биты приведены вместе (см., Например, UTF-8),

  • Для маркера конца можно, например, указать, что набор MSB указывает последний байт и, таким образом, имеет 7 бит данных на байт.

Возможны и другие варианты.

2 голосов
/ 06 июня 2011

Вас могут заинтересовать следующие функции:

htonl, htons, ntohl, ntohs - конвертировать значения между хостом и сетевым байтом заказ

   uint32_t htonl(uint32_t hostlong);
   uint16_t htons(uint16_t hostshort);
   uint32_t ntohl(uint32_t netlong);
   uint16_t ntohs(uint16_t netshort);

man byteorder

1 голос
/ 06 июня 2011

Буферы протокола Google обеспечивают готовую реализацию, которая использует кодировки переменной ширины.

1 голос
/ 06 июня 2011

Вы можете попробовать Сетевой порядок байтов

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...