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

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Поменять местами первый элемент массива с максимальным, другой с минимальным, остальное оставить без изменения http://www.cyberforum.ru/cpp-beginners/thread900395.html
Дан массив С, состоящий из N элементов (N <10). Поменять местами первый элемент массива с максимальным, другой с минимальным, остальное оставить без изменения. Вывести на печать заданий и новообразованный массивы.
C++ И снова шифровка/расшифровка Тема курсового проекта - шифрование/расшифрование текстовых файлов. Проблема - не распознает русский алфавит, и не расшифровывает шифр, который образуется при шифровки чисел. #include "stdafx.h" #include <iostream> using namespace std; const int n = 256; //Конвертация символа в число int getIndexChar(char ); //Конвертация числа в симовл http://www.cyberforum.ru/cpp-beginners/thread900387.html
C++ Открытие файлов C++
Необходимо открывать файл из программы, но имя у него может отличаться от, например, input.txt. Поэтому я хотел бы сделать так, чтобы можно было считать имя файла, а потом открыть его. Сейчас код выглядит примерно так: #include <iostream> #include <fstream> using namespace std; int main() { string fileName;
Массив данных: вычислить произвидение максимального и минимального элемента C++
Для чисел Х (0.01; -27.3; 0; 125.27; -371.45; 0; 12; -5; -172.3; 0.05; - 17.1; 49.5; -0.01) необходимо обчислить произвидение максимального и минимального элемента.
C++ Помощь с решением некоторых задач http://www.cyberforum.ru/cpp-beginners/thread900337.html
del, разобрался, удалите
C++ Как через базовый класс вызывать виртуальную функцию во всех потомках? Ну например, есть класс: class BATYANA { BATYANA(); virtual ~BATYANA(); virtual int Test(); } подробнее

Показать сообщение отдельно
stawerfar
141 / 55 / 4
Регистрация: 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;
}
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru