путаница - PullRequest
       19

путаница

0 голосов
/ 28 марта 2020

Таким образом, для обеспечения контекста моя система имеет прямой порядок байтов, а файл, из которого я читаю, является прямым порядком байтов (формат MIDI, для тех, кто интересуется). Я должен читать различные данные из файла, включая целые числа без знака (8-битные, 16-битные и 32-битные), символы и логические значения.

Пока я знаю, что чтение целых чисел без знака будет проблема с fread (), потому что мне пришлось бы преобразовать их с прямым порядком байтов в младший. Мой первый вопрос, хотя, возможно, для некоторых это глупо, нужно ли мне также преобразовывать символы и логические значения?

Мой второй вопрос касается всего формата файла. Поскольку файл находится в другой системе с прямым порядком байтов, нужно ли мне читать файл от конца к началу (поскольку позиции MSB и LSB будут разными)? Или мне нужно прочитать значения от начала до конца, как обычно, а затем преобразовать их в little-endian?

Спасибо, что нашли время прочитать мой пост и за любые ответы, которые я может получить!

Ответы [ 2 ]

0 голосов
/ 28 марта 2020

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

Если вы ожидаете 16-разрядное число со знаком, за которым следует 8-разрядное число без знака, за которым следует 32-разрядное число без знака, вы пишете функцию, считывающую два байта, и возвращаете их, преобразованные в 16-разрядное число со знаком, один он читает один байт и возвращает его как 8-разрядное число без знака, а тот, который читает четыре байта, возвращает их, преобразованные в 32-разрядное число. Создайте 16- и 32-разрядные числа, используя сдвиг битов.

0 голосов
/ 28 марта 2020

Endianness меняет порядок только внутри слов определенной длины, обычно 2, 4 или 8 байтов. Если вы читаете в однобайтовом значении, таком как char или bool, порядок байтов не влияет. Однако, если вы читаете в любом значении, которое больше, чем байт, например, целое число, тогда порядковый номер имеет значение. Вы по-прежнему можете использовать fread, так как порядковый номер не имеет ничего общего с чтением файла, просто убедитесь, что он преобразован из старшего в младший.

...