Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.54/246: Рейтинг темы: голосов - 246, средняя оценка - 4.54
 Аватар для stawerfar
150 / 64 / 8
Регистрация: 14.12.2010
Сообщений: 347
Записей в блоге: 1

Порядок байт в big-endian и little-endian

13.06.2013, 11:29. Показов 49144. Ответов 32
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет! Народ подскажите мне пожалуйста простые прописные истины, а то я что то запутался!
Предположим что у нас в байте 8 - бит и где число 5 будет иметь вид 101.
Как будет выглядеть число 5 в 2-х байтах памяти в big-endian и little-endian.

0000 0000 0000 0101 - big-endian ?
0000 0101 0000 0000 - little-endian ?
1
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
13.06.2013, 11:29
Ответы с готовыми решениями:

Как объединить пару байт в слово? (Загрузка WAV, Big Endian)
Привет! Есть звуковой файл с 16-и битными амплитудами. Да не суть. После открытия файла и чтения всяких заголовков, остаются чистые RAW...

Из little endian в big endian
Есть 256-битное 16-ричное число: 54 68 69 73 20 69 73 20 6D 65 73 73 61 67 65 2C 20 6C 65 6E 67 74 68 3D 33 32 20 62 79 74 65 73 Как...

Big-endian тестирование
Есть программа, которая должна работать на little и big endian одинаково. В ней куча всяких "ifdef". С помощью какого ПО для...

32
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
13.06.2013, 12:17
0000 0000 0000 0101 - little-endian
0101 0000 0000 0000 - big-endian
1
 Аватар для stawerfar
150 / 64 / 8
Регистрация: 14.12.2010
Сообщений: 347
Записей в блоге: 1
13.06.2013, 12:26  [ТС]
Почему вы перевернули порядок бит в старшем байте в big-endian?
0
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
13.06.2013, 12:31
stawerfar, при чем тут порядок бит? разница между little-endian и big-endian в порядке байт
3
 Аватар для stawerfar
150 / 64 / 8
Регистрация: 14.12.2010
Сообщений: 347
Записей в блоге: 1
13.06.2013, 12:39  [ТС]
А еще было бы не плохо если бы вы меня сослали на нормальный источник что бы я мог вас не мучитьь глупыми вопросами

Добавлено через 2 минуты
Просто Вы написали 0000 0000 0000 0101 - little-endian это 5 и я с этим согласен, а вот
0101 0000 0000 0000 - big-endian это не 5 это 80 так как Вы переставили не только байты но и биты.
Я так думаю это должно быть как то так ?
0000 0101 0000 0000?
1
Эксперт С++
 Аватар для MikeSoft
3957 / 1812 / 184
Регистрация: 21.11.2009
Сообщений: 2,540
13.06.2013, 12:43
stawerfar, далеко ходить не нужно: Википедия - Порядок байтов. Пример.
1
Эксперт С++
 Аватар для grizlik78
2382 / 1666 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
13.06.2013, 12:47
Лучший ответ Сообщение было отмечено как решение

Решение

Позволю-ка я себе не согласиться с Jupiter. В исходном сообщении правильный порядок (только непонятно, зачем байты разделены по 4 бита).
В big-endian в порядке увеличения адресов сначала располагается старшая часть числа, затем младшая:
00000000 00000101 - big-endian.
В little-endian наоборот, сначала младшая:
00000101 00000000 - little-endian.
6
 Аватар для stawerfar
150 / 64 / 8
Регистрация: 14.12.2010
Сообщений: 347
Записей в блоге: 1
13.06.2013, 12:52  [ТС]
Да понятно спасибо. А пробелы поставил для удобства чтения.
Тогда еще вопрос раз меняются направления байт как я и думал , тогда скажите мне как приходит усечение из 2-х байт в 1 байт. Я имею введу слева на право или с права на лево в big и little endians?
Мне это нужно для того чтобы лучше понять вот это
C++
1
2
3
4
5
6
7
#include <stdio.h>
unsigned short x = 1; /* 0x0001 */
int main(void)
{
  printf("%s\n", *((unsigned char *) &x) == 0 ? "big-endian" : "little-endian");
  return 0;
}
0
Эксперт С++
 Аватар для grizlik78
2382 / 1666 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
13.06.2013, 12:55
Цитата Сообщение от stawerfar Посмотреть сообщение
тогда скажите мне как приходит усечение из 2-х байт в 1 байт.
А где здесь усечение? Проверяется байт по младшему адресу в записи числа 1. В big-endian там будет 0, в little-endian — единица.
1
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
13.06.2013, 13:03
Цитата Сообщение от grizlik78 Посмотреть сообщение
в порядке увеличения адресов сначала располагается старшая часть числа, затем младшая:
00000000 00000101 - big-endian.
верно, только у Вас слева на право увеличение адресов, а у меня наоборот, хотя с big-endian я накосячил:
Цитата Сообщение от grizlik78 Посмотреть сообщение
непонятно, зачем байты разделены по 4 бита
1
 Аватар для stawerfar
150 / 64 / 8
Регистрация: 14.12.2010
Сообщений: 347
Записей в блоге: 1
13.06.2013, 13:07  [ТС]
Спасибо теперь я все понял
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
13.06.2013, 14:12
Цитата Сообщение от stawerfar Посмотреть сообщение
Почему вы перевернули порядок бит в старшем байте в big-endian?
Он перевернул порядок полубайт, а не порядок бит. Если бы бит, то 1010 0000 0000 0000. Обсчитался, в итоге попутал байты с полубайтами.
1
 Аватар для stawerfar
150 / 64 / 8
Регистрация: 14.12.2010
Сообщений: 347
Записей в блоге: 1
14.06.2013, 14:04  [ТС]
С направлением байт вроде разобрался и естественно хотел посмотреть на это на примере.
Для этого я сделал с помощью битовых масок api'ки для возможности посмотреть переменные в бинарном виде.
И с толкнулся с таким вопросом. Почему в ниже описанной функции trigerbyte я число 5 в littel - endian вижу как
0000 0000 0000 0101 (пример в 2-х байтах) а не как 0000 0101 0000 0000 ?
А в функции memorybyte вижу как положено т.е. в порядке от младшего байта к старшему 0000 0101 0000 0000 (пример в 2-х байтах)
P.S Визуальное разделение на полубайты сделал исключительно для собственного удобства.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
#include <iostream>
#include <iomanip>
#include <stdint.h>
 
/* повернуть байты */
template <class type>
type& reverse(type& val)
{
    int size = sizeof(val);
    int size2 = size-- >> 1;
    uint8_t *pt = (uint8_t*)&val;
 
    register uint8_t b = 0;
    register uint8_t e = 0;
 
    for (int i = 0; i < size2; ++i)
    {
        b = pt[i];
        e = pt[size - i];
        pt[i] = e;
        pt[size - i] = b;
    }
 
    return (val);
}
 
template <typename type>
std::ostream& trigerbyte(std::ostream& cout,type& val)
{
 
    int sizebyte = sizeof(val);
    int sizebit = sizebyte * 8;
 
  cout << std::endl << "Triger binary view:" << std::endl;
 
    /* определить направление нумерации ячеек памяти */
    if (&sizebyte < &sizebit)
    {
        /* пронумеровать адресное пространство */
        for (int i = 0; i < sizebyte; ++i)
        {
            cout << std::setw(8 / 2) << " "<<i;
            cout << "     ";
        }
 
    }
    else
    {
        /* пронумеровать адресное пространство */
        for (int i = sizebyte; i >= 0; --i)
        {
            cout << std::setw(8 / 2) << " "<< i;
            cout << "     ";
        }
 
    }
 
 
    cout << std::endl;
 
    /* отобразить число в битовой последовательности */
    for (int i = sizebit - 1; i >= 0 ; --i)
    {
        cout << !!(val & (1 << i));
        if (i && !(i % 4))
        {
            cout << " ";
        }
    }
    return (cout << std::endl);
}
 
template <class T>
std::ostream& memorybyte(std::ostream& cout, T value)
{
    int sizebyte = sizeof(value);
    int sizebit = sizebyte * 8;
 
    cout << std::endl << "Mamory binary view:" << std::endl;
 
    /* определить направление нумерации ячеек памяти */
    if (&sizebyte < &sizebit)
    {
        /* пронумеровать адресное пространство */
        for (int i = 0; i < sizebyte; ++i)
        {
            cout << std::setw(8 / 2) << " "<<i;
            cout << "     ";
        }
 
    }
    else
    {
        /* пронумеровать адресное пространство */
        for (int i = sizebyte; i >= 0; --i)
        {
            cout << std::setw(8 / 2) << " "<< i;
            cout << "     ";
        }
 
    }
  std::cout << std::endl;
 
    /* преобразовать все к байтовому виду */
    unsigned char* pt = (unsigned char*)&value;
 
    for (int i = 0; i < sizebyte; ++i)
    {
        for (int j = (1 << 3) - 1; j >= 0; --j)
        {
            cout << !!(pt[i] & (1 << j));
            if (j && !(j % 4) || j == 0)
            {
                cout << " ";
            }
        }
    }
    return (cout << std::endl);
}
 
int main()
{
    int value = 5;
 
    trigerbyte(std::cout,value);
    memorybyte(std::cout,value);
    reverse(value);
    trigerbyte(std::cout,value);
    memorybyte(std::cout,value);
 
    return 0;
}
0
 Аватар для stawerfar
150 / 64 / 8
Регистрация: 14.12.2010
Сообщений: 347
Записей в блоге: 1
14.06.2013, 14:13  [ТС]
Вот консольный вывод
Миниатюры
Порядок байт в big-endian и little-endian  
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
14.06.2013, 17:44
Зачем так сложно ?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
 
 
 
int main()
{
    int const Value = 0x1234abcd;
    unsigned char const *pByte = (unsigned char const *)&Value;
 
    for (size_t i = 0; i < sizeof (Value); ++i)
    {
        std::cout << std::hex << static_cast<int>(pByte[i]);
    }
 
    std::cout << std::endl;
 
    return 0;
}
>cdab3412
Добавлено через 3 минуты
Цитата Сообщение от stawerfar Посмотреть сообщение
template <typename type>
std::ostream& trigerbyte(std::ostream& cout,type& val)
Что делает эта функция ? Из названия непонятно.

Цитата Сообщение от stawerfar Посмотреть сообщение
int sizebyte = sizeof(val);
int sizebit = sizebyte * 8;
cout << std::endl << "Triger binary view:" << std::endl;
/* определить направление нумерации ячеек памяти */
if (&sizebyte < &sizebit)
Этот фрагмент определяет лишь то, как относительно друг друга расположены
переменные sizebyte и sizebit. Компилятор может расположить их в памяти так,
как ему вздумается, для контроля над этим нужно вставлять барьер компилятора.
1
 Аватар для stawerfar
150 / 64 / 8
Регистрация: 14.12.2010
Сообщений: 347
Записей в блоге: 1
14.06.2013, 22:00  [ТС]
Цитата Сообщение от Убежденный Посмотреть сообщение
Компилятор может расположить их в памяти так,
как ему вздумается, для контроля над этим нужно вставлять барьер компилятора
Про какой барьер компилятора вы говорите? И как его применять?

Добавлено через 11 минут
Цитата Сообщение от Убежденный Посмотреть сообщение
#include <iostream>
int main()
{
* * int const Value = 0x1234abcd;
* * unsigned char const *pByte = (unsigned char const *)&Value;
for (size_t i = 0; i < sizeof (Value); ++i)
* * {
* * * * std::cout << std::hex << static_cast<int>(pByte[i]);
* * }
std::cout << std::endl;
return 0;
}
То что вы написали это шестнадцатиричный вид значений каждого байта. Да не спорю по результату видно что байты перевернуты. Но я в примерах смотрю на числа через битовую маску, тем самым могу увидеть бинарное представление числа.
В первом случае в функции trigerbyte я не преобразую переменную (которую нужно посмотреть в бинарном виде) к указателю на тип и получаю в результате вид числа (например) 5 таким 0000 0000 0000 0101(значение в short)
вместо 0000 0101 0000 0000. Почему так происходит?
0
Эксперт С++
 Аватар для grizlik78
2382 / 1666 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
14.06.2013, 22:08
Цитата Сообщение от stawerfar Посмотреть сообщение
В первом случае в функции trigerbyte я не преобразую переменную (которую нужно посмотреть в бинарном виде) к указателю на тип и получаю в результате вид числа (например) 5 таким 0000 0000 0000 0101(значение в short)
В этом случае компилятор следит, чтобы младший бит оказался "самым правым", а страший — "самым левым". То есть когда мы говорим про младший разряд или байт какого-то числа или пременной, то это забота компилятора, чтобы они оказались именно младшими. От машинного представления числа это не зависит, мы не спускаемся до машинного представления.

Цитата Сообщение от stawerfar Посмотреть сообщение
я не преобразую переменную (которую нужно посмотреть в бинарном виде) к указателю на тип
Ну а вот когда преобразуешь — сам спускаешься до понятий байт и бит, которых для чисел и переменных с точки зрения языка нет. Значит должен сам учитывать машинное представление. Теперь от него порядок байт зависит напрямую.
1
 Аватар для stawerfar
150 / 64 / 8
Регистрация: 14.12.2010
Сообщений: 347
Записей в блоге: 1
14.06.2013, 22:24  [ТС]
Спасибо!

Добавлено через 1 минуту
А про какие барьеры говорил "Убежденный"?
0
Эксперт С++
 Аватар для grizlik78
2382 / 1666 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
14.06.2013, 22:27
Про барьеры не знаю, но выражение (&sizebyte < &sizebit) действительно бессмысленное.
1
 Аватар для stawerfar
150 / 64 / 8
Регистрация: 14.12.2010
Сообщений: 347
Записей в блоге: 1
14.06.2013, 22:41  [ТС]
Да я согласен нужно было использовать например
C++
1
2
char buff[2];
if (&buff[0] < &buff[1])
Добавлено через 1 минуту
Эта запись должна точно гарантировать то что эти указатели следуют друг за другом
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
14.06.2013, 22:41
Помогаю со студенческими работами здесь

Как проще всего работать с Big-Endian C++ ?
С++. Как проще всего работать с Big-Endian, используя стандартные операции ?

Перекодировать из UCS-2 Little Endian в UTF
Есть много файлов *.txt в кодировке (как я понял) UCS-2 Little Endian. Как перевести эти файлы в кодировку UTF или ANSI? Пока что делаю это...

Из UCS-2 Little Endian в UTF-8 без BOM
Здравствуйте! Имеется файлик xml в кодировке UCS-2 Little Endian. Хочу написать обработчик на с++ который будет менять кодировку на...

Перегрузка ifstream и ofstream для работы с файлами в little-endian формате?
Всем привет, мне нужно реализовать классы для работы с файлами в little-endian формате. Для этого задумал сделать public-потомки...

Порядок байт в union
#include &lt;iostream&gt; using namespace std; void disp_binary(unsigned u); union swap_bytes { short int num; char ch; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
Программный отбор значений справочника
Maks 21.03.2026
Установка программного отбора значений справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит предопределенное значение перечислений. Процедура. . .
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru