Код Unix (с прямым порядком байтов) и тот же код на Linux (с прямым порядком байтов), создает файл с разным выходным диаметром

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

Блок сообщения для записи в выходной файл имеет формат:

ACE_Message_Block* mb = m_pReqMsgBlock;
while (mb) {
                out.write(mb->rd_ptr(), mb->size());
                mb = mb->cont();
           }

Кто-нибудь может подсказать, что можно добавить в код, чтобы байты могли быть записаны ожидаемым образом?

2 ответа

Вам придется конвертировать из формата с прямым порядком байтов в формат с прямым порядком байтов. Это должно быть сделано отдельно для 16-битных и 32-битных значений в структуре.

Функции как htons а также htonl может использоваться для преобразования 16-битных и 32-битных целых чисел соответственно.

После того, как числа преобразованы, тогда это может быть записано через write функция.

Если вы записываете двоичные данные в файл, "правильная" последовательность этих двоичных данных зависит от компьютера. Поэтому правильно, что эти данные отличаются, если они запускаются на машине с другим порядком байтов. Вы, вероятно, снова проанализируете эти двоичные данные с другой программой на том же компьютере с Linux, которая также ожидает, что они будут иметь порядок байтов.

Если вы хотите, чтобы выходные данные не зависели от порядка байтов (например, потому что программа, которая считывает данные, находится на вашем компьютере с прямым порядком байтов Unix), вы не должны выводить двоичные данные.

Другие вопросы по тегам