Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.12.41.87] |
|
Сообщ.
#1
,
|
|
|
Что это означает: big-endian и little-endian ?
|
Сообщ.
#2
,
|
|
|
AndreySol
Речь идет о порядке хранения цифр целого числа в оперативной памяти. Известны два принципиально различные подхода к решению этого вопроса. Человек "западного стиля" как читает числа, так и нумерует позиции цифр числа слева направо, в результате чего старшая цифра оказывается в самой первой левой (младшей) позиции. В компьютерной терминологии такого рода расположение целого числа в оперативной памяти называется "обратный порядок байтов" – по-английски –"big-endian". Этот же "человеческий" порядок принят и при передаче целых чисел в сети, и называется "сетевой порядок байтов – network byte order". В IBM-совместимых компьютерах и компьютерах некоторых других фирм принят как-бы "естественный" для компьютера порядок расположения байтов целого числа, при котором в младшей – левой - позиции числа располагается и младшая значащая цифра. Это – "прямой порядок байтов", или по-английски "litle-endian". В процессорах фирмы Motorolla и некоторых других принят обратный порядок следования. Например, число 247 в этих двух способах расположения в памяти будет выглядеть так: · 247 - обратный порядок байтов; · 742 - прямой порядок байтов. Поскольку на хосте может поддерживаться любой порядок следования байтов, то он называется общим термином "порядок байтов хоста – host byte order". |
Сообщ.
#3
,
|
|
|
Проще воспользоваться поиском в интернете набрав big-endian к примеру
http://private.peterlink.ru/kx/_software_h...big2little.html |
Сообщ.
#4
,
|
|
|
Значит такого типа данных как big-endian или little-endian не существует ?
|
Сообщ.
#5
,
|
|
|
Это не тип данных. Это порядок следования байтов в многобайтовых типах.
little-endian - младший байт располагается в памяти по меньшему адресу. big-endian - старший байт располагается в памяти по меньшему адресу. Есть более сложные варианты расположения, но они довольно редки. |
Сообщ.
#6
,
|
|
|
Короче вот пример:
В файле есть инфа и предстовляет из себя 2 байта: 0xFFC0 Если ее прочитать не побайтово, а сразу в переменную типа unsigned short (2 байта), то получим мы не 0xFFC0 (big-endian), а 0x0CFF (little-endian), и нам будет их необходимо перевернуть, чтобы получить ожидаемое значение. Конечно можно по 1 байту читать и пользоваться сдвигом, но это неправильно. |
Сообщ.
#7
,
|
|
|
А есть какой способ определиться как считывать байты: как big-endian или как little-endian ?
|
Сообщ.
#8
,
|
|
|
AndreySol,
Это определяется исключительно форматом. То есть должно быть описано в доке какой именно формат используется в каждом конкретном случае. |
Сообщ.
#9
,
|
|
|
AndreySol
Порядок хранения и передачи касается только целых чисел, и только тех, которые передаются в служебных заголовках, обрабатываемых по пути следования IP-пакетов, а так же в заголовках транспортных протоколов - те той информации, которая передается в сеть. В файлах данных, передаваемых по протоколу TCP, это должно определяться, как было сказано, протоколом взаимодействия. |
Сообщ.
#10
,
|
|
|
Ага, понял. Напоследок - подкиньте код преобразования big-endian <-> little-endian.
|
Сообщ.
#11
,
|
|
|
#define CHANGE_ENDIAN_16(x) ((((x)&0xff)<<8)|(((x)>>8)&0xff)) __inline int change_endian_16(int x) { return CHANGE_ENDIAN_16(x); } #define CHANGE_ENDIAN_32(x) ((((x)&0xff)<<24)|(((x)&0xff00)<<8)|(((x)>>8)&0xff00)|(((x)>>24)&0xff)) __inline long change_endian_32(long x) { return CHANGE_ENDIAN_32(x); } |
Сообщ.
#12
,
|
|
|
inline short ByteReverse(short x) { return (x << 8) | (x >> 8); } inline long ByteReverse(long x) { return (ByteReverse((short)x) << 16) | ByteReverse((short)(x>>16)); } Цитата А есть какой способ определиться как считывать байты: как big-endian или как little-endian ? Обычно это задается в самом файле набором определенных байт. Нужно изучать документацию. |
Сообщ.
#13
,
|
|
|
Спасибо за ответы и за код
|