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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 60, средняя оценка - 4.72
stawerfar
141 / 55 / 4
Регистрация: 14.12.2010
Сообщений: 347
Записей в блоге: 1
#1

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

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

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

0000 0000 0000 0101 - big-endian ?
0000 0101 0000 0000 - little-endian ?
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.06.2013, 11:29
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Порядок байт в big-endian и little-endian (C++):

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

Из little endian в big endian - C++
Есть 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 тестирование - C++
Есть программа, которая должна работать на little и big endian одинаково. В ней куча всяких "ifdef". С помощью какого ПО для виртуализации...

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

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

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

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

Добавлено через 2 минуты
Просто Вы написали 0000 0000 0000 0101 - little-endian это 5 и я с этим согласен, а вот
0101 0000 0000 0000 - big-endian это не 5 это 80 так как Вы переставили не только байты но и биты.
Я так думаю это должно быть как то так ?
0000 0101 0000 0000?
MikeSoft
Эксперт С++
3793 / 1775 / 85
Регистрация: 21.11.2009
Сообщений: 2,540
13.06.2013, 12:43 #6
stawerfar, далеко ходить не нужно: Википедия - Порядок байтов. Пример.
grizlik78
Эксперт С++
1908 / 1440 / 111
Регистрация: 29.05.2011
Сообщений: 2,996
13.06.2013, 12:47 #7
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Позволю-ка я себе не согласиться с Jupiter. В исходном сообщении правильный порядок (только непонятно, зачем байты разделены по 4 бита).
В big-endian в порядке увеличения адресов сначала располагается старшая часть числа, затем младшая:
00000000 00000101 - big-endian.
В little-endian наоборот, сначала младшая:
00000101 00000000 - little-endian.
stawerfar
141 / 55 / 4
Регистрация: 14.12.2010
Сообщений: 347
Записей в блоге: 1
13.06.2013, 12:52  [ТС] #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
Эксперт С++
1908 / 1440 / 111
Регистрация: 29.05.2011
Сообщений: 2,996
13.06.2013, 12:55 #9
Цитата Сообщение от stawerfar Посмотреть сообщение
тогда скажите мне как приходит усечение из 2-х байт в 1 байт.
А где здесь усечение? Проверяется байт по младшему адресу в записи числа 1. В big-endian там будет 0, в little-endian — единица.
Jupiter
Каратель
Эксперт С++
6553 / 3973 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
13.06.2013, 13:03 #10
Цитата Сообщение от grizlik78 Посмотреть сообщение
в порядке увеличения адресов сначала располагается старшая часть числа, затем младшая:
00000000 00000101 - big-endian.
верно, только у Вас слева на право увеличение адресов, а у меня наоборот, хотя с big-endian я накосячил:
Цитата Сообщение от grizlik78 Посмотреть сообщение
непонятно, зачем байты разделены по 4 бита
stawerfar
141 / 55 / 4
Регистрация: 14.12.2010
Сообщений: 347
Записей в блоге: 1
13.06.2013, 13:07  [ТС] #11
Спасибо теперь я все понял
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
13.06.2013, 14:12 #12
Цитата Сообщение от stawerfar Посмотреть сообщение
Почему вы перевернули порядок бит в старшем байте в big-endian?
Он перевернул порядок полубайт, а не порядок бит. Если бы бит, то 1010 0000 0000 0000. Обсчитался, в итоге попутал байты с полубайтами.
stawerfar
141 / 55 / 4
Регистрация: 14.12.2010
Сообщений: 347
Записей в блоге: 1
14.06.2013, 14:04  [ТС] #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
141 / 55 / 4
Регистрация: 14.12.2010
Сообщений: 347
Записей в блоге: 1
14.06.2013, 14:13  [ТС] #14
Вот консольный вывод
Миниатюры
Порядок байт в big-endian и little-endian  
Убежденный
Системный программист
Эксперт С++
15516 / 7014 / 1109
Регистрация: 02.05.2013
Сообщений: 11,452
Завершенные тесты: 1
14.06.2013, 17:44 #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. Компилятор может расположить их в памяти так,
как ему вздумается, для контроля над этим нужно вставлять барьер компилятора.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.06.2013, 17:44
Привет! Вот еще темы с ответами:

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

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

Порядок байт в слове и бит в байте - C++
читал эту требуются пояснения. A B C D - адреса в них число 128 BE A B C D ...

Определить порядок хранения байт 16-ричного числа - C++
Всем привет! Имеется следующий вопрос: написать программу, которая показывает порядок хранения байт 16-ричного числа. Как это сделать?


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
14.06.2013, 17:44
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru