Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 60, средняя оценка - 4.72
stawerfar
 Аватар для stawerfar
141 / 55 / 4
Регистрация: 14.12.2010
Сообщений: 347
Записей в блоге: 1
13.06.2013, 11:29     Порядок байт в big-endian и little-endian #1
Всем привет! Народ подскажите мне пожалуйста простые прописные истины, а то я что то запутался!
Предположим что у нас в байте 8 - бит и где число 5 будет иметь вид 101.
Как будет выглядеть число 5 в 2-х байтах памяти в big-endian и little-endian.

0000 0000 0000 0101 - big-endian ?
0000 0101 0000 0000 - little-endian ?
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
13.06.2013, 12:17     Порядок байт в big-endian и little-endian #2
0000 0000 0000 0101 - little-endian
0101 0000 0000 0000 - big-endian
stawerfar
 Аватар для stawerfar
141 / 55 / 4
Регистрация: 14.12.2010
Сообщений: 347
Записей в блоге: 1
13.06.2013, 12:26  [ТС]     Порядок байт в big-endian и little-endian #3
Почему вы перевернули порядок бит в старшем байте в big-endian?
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
13.06.2013, 12:31     Порядок байт в big-endian и little-endian #4
stawerfar, при чем тут порядок бит? разница между little-endian и big-endian в порядке байт
stawerfar
 Аватар для stawerfar
141 / 55 / 4
Регистрация: 14.12.2010
Сообщений: 347
Записей в блоге: 1
13.06.2013, 12:39  [ТС]     Порядок байт в big-endian и little-endian #5
А еще было бы не плохо если бы вы меня сослали на нормальный источник что бы я мог вас не мучитьь глупыми вопросами

Добавлено через 2 минуты
Просто Вы написали 0000 0000 0000 0101 - little-endian это 5 и я с этим согласен, а вот
0101 0000 0000 0000 - big-endian это не 5 это 80 так как Вы переставили не только байты но и биты.
Я так думаю это должно быть как то так ?
0000 0101 0000 0000?
MikeSoft
Эксперт C++
 Аватар для MikeSoft
3781 / 1765 / 85
Регистрация: 21.11.2009
Сообщений: 2,540
13.06.2013, 12:43     Порядок байт в big-endian и little-endian #6
stawerfar, далеко ходить не нужно: Википедия - Порядок байтов. Пример.
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
13.06.2013, 12:47     Порядок байт в big-endian и little-endian #7
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Позволю-ка я себе не согласиться с Jupiter. В исходном сообщении правильный порядок (только непонятно, зачем байты разделены по 4 бита).
В big-endian в порядке увеличения адресов сначала располагается старшая часть числа, затем младшая:
00000000 00000101 - big-endian.
В little-endian наоборот, сначала младшая:
00000101 00000000 - little-endian.
stawerfar
 Аватар для stawerfar
141 / 55 / 4
Регистрация: 14.12.2010
Сообщений: 347
Записей в блоге: 1
13.06.2013, 12:52  [ТС]     Порядок байт в big-endian и little-endian #8
Да понятно спасибо. А пробелы поставил для удобства чтения.
Тогда еще вопрос раз меняются направления байт как я и думал , тогда скажите мне как приходит усечение из 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;
}
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
13.06.2013, 12:55     Порядок байт в big-endian и little-endian #9
Цитата Сообщение от stawerfar Посмотреть сообщение
тогда скажите мне как приходит усечение из 2-х байт в 1 байт.
А где здесь усечение? Проверяется байт по младшему адресу в записи числа 1. В big-endian там будет 0, в little-endian — единица.
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
13.06.2013, 13:03     Порядок байт в big-endian и little-endian #10
Цитата Сообщение от grizlik78 Посмотреть сообщение
в порядке увеличения адресов сначала располагается старшая часть числа, затем младшая:
00000000 00000101 - big-endian.
верно, только у Вас слева на право увеличение адресов, а у меня наоборот, хотя с big-endian я накосячил:
Цитата Сообщение от grizlik78 Посмотреть сообщение
непонятно, зачем байты разделены по 4 бита
stawerfar
 Аватар для stawerfar
141 / 55 / 4
Регистрация: 14.12.2010
Сообщений: 347
Записей в блоге: 1
13.06.2013, 13:07  [ТС]     Порядок байт в big-endian и little-endian #11
Спасибо теперь я все понял
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
13.06.2013, 14:12     Порядок байт в big-endian и little-endian #12
Цитата Сообщение от stawerfar Посмотреть сообщение
Почему вы перевернули порядок бит в старшем байте в big-endian?
Он перевернул порядок полубайт, а не порядок бит. Если бы бит, то 1010 0000 0000 0000. Обсчитался, в итоге попутал байты с полубайтами.
stawerfar
 Аватар для stawerfar
141 / 55 / 4
Регистрация: 14.12.2010
Сообщений: 347
Записей в блоге: 1
14.06.2013, 14:04  [ТС]     Порядок байт в big-endian и little-endian #13
С направлением байт вроде разобрался и естественно хотел посмотреть на это на примере.
Для этого я сделал с помощью битовых масок 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;
}
stawerfar
 Аватар для stawerfar
141 / 55 / 4
Регистрация: 14.12.2010
Сообщений: 347
Записей в блоге: 1
14.06.2013, 14:13  [ТС]     Порядок байт в big-endian и little-endian #14
Вот консольный вывод
Миниатюры
Порядок байт в big-endian и little-endian  
Убежденный
Системный программист
 Аватар для Убежденный
14182 / 6197 / 984
Регистрация: 02.05.2013
Сообщений: 10,322
Завершенные тесты: 1
14.06.2013, 17:44     Порядок байт в big-endian и little-endian #15
Зачем так сложно ?
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. Компилятор может расположить их в памяти так,
как ему вздумается, для контроля над этим нужно вставлять барьер компилятора.
stawerfar
 Аватар для stawerfar
141 / 55 / 4
Регистрация: 14.12.2010
Сообщений: 347
Записей в блоге: 1
14.06.2013, 22:00  [ТС]     Порядок байт в big-endian и little-endian #16
Цитата Сообщение от Убежденный Посмотреть сообщение
Компилятор может расположить их в памяти так,
как ему вздумается, для контроля над этим нужно вставлять барьер компилятора
Про какой барьер компилятора вы говорите? И как его применять?

Добавлено через 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. Почему так происходит?
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
14.06.2013, 22:08     Порядок байт в big-endian и little-endian #17
Цитата Сообщение от stawerfar Посмотреть сообщение
В первом случае в функции trigerbyte я не преобразую переменную (которую нужно посмотреть в бинарном виде) к указателю на тип и получаю в результате вид числа (например) 5 таким 0000 0000 0000 0101(значение в short)
В этом случае компилятор следит, чтобы младший бит оказался "самым правым", а страший — "самым левым". То есть когда мы говорим про младший разряд или байт какого-то числа или пременной, то это забота компилятора, чтобы они оказались именно младшими. От машинного представления числа это не зависит, мы не спускаемся до машинного представления.

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

Добавлено через 1 минуту
А про какие барьеры говорил "Убежденный"?
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
14.06.2013, 22:27     Порядок байт в big-endian и little-endian #19
Про барьеры не знаю, но выражение (&sizebyte < &sizebit) действительно бессмысленное.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.06.2013, 22:41     Порядок байт в big-endian и little-endian
Еще ссылки по теме:

C++ Из UCS-2 Little Endian в UTF-8 без BOM
C++ Big-endian тестирование
C++ Перегрузка ifstream и ofstream для работы с файлами в little-endian формате?

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

Или воспользуйтесь поиском по форуму:
stawerfar
 Аватар для stawerfar
141 / 55 / 4
Регистрация: 14.12.2010
Сообщений: 347
Записей в блоге: 1
14.06.2013, 22:41  [ТС]     Порядок байт в big-endian и little-endian #20
Да я согласен нужно было использовать например
C++
1
2
char buff[2];
if (&buff[0] < &buff[1])
Добавлено через 1 минуту
Эта запись должна точно гарантировать то что эти указатели следуют друг за другом
Yandex
Объявления
14.06.2013, 22:41     Порядок байт в big-endian и little-endian
Ответ Создать тему
Опции темы

Текущее время: 22:05. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru