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

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

13.06.2013, 11:29. Показов 49050. Ответов 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
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru