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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.89
kvigon
0 / 0 / 0
Регистрация: 15.08.2014
Сообщений: 7
#1

Считать массив байт в переменную типа int в обратном порядке - C++

21.08.2014, 16:24. Просмотров 1402. Ответов 14
Метки нет (Все метки)

Есть массив байт:
C++
1
char byData[4] = {0x87, 0xd6, 0x12, 0x00};
Нужно считать его в переменную типа int в обратном порядке, т.е. должно получится hex-число 0x0012D687
Пытаюсь как-то так:
C++
1
2
3
4
5
int c = 0;
c += byData[3]*0x01000000;
c += byData[2]*0x00010000;
c += byData[1]*0x00000100;
c += byData[0];
Ну естественно ничего не выходит. Вместо лидирующих нулей появляются ffff, и в сумме это все дает неверное значение.
Как правильно сдвинуть байты? Нужно к побитовому сдвигу прибегать? вроде ж без него можно, только я где-то косячу
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.08.2014, 16:24     Считать массив байт в переменную типа int в обратном порядке
Посмотрите здесь:

C++ Распознать строку в переменную типа int
Ввод символа в переменную типа INT C++
C++ Считать три предложения и вывести их в обратном порядке
C++ Передать массив элементов(типа int) объекта, в функцию из массивов(типа int)
C++ Поместить двоичный код, в веденной строке, в переменную типа int и unsigned int.
Присвоить переменной типа int содержимое четырёх байт из массива C++
C++ Почему запись int в файл происходит в обратном порядке?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
castaway
Эксперт С++
4880 / 3016 / 370
Регистрация: 10.11.2010
Сообщений: 11,076
Записей в блоге: 10
Завершенные тесты: 1
21.08.2014, 16:33     Считать массив байт в переменную типа int в обратном порядке #2
А если использовать unsigned int ? Или uint32_t ?
kvigon
0 / 0 / 0
Регистрация: 15.08.2014
Сообщений: 7
21.08.2014, 16:45  [ТС]     Считать массив байт в переменную типа int в обратном порядке #3
Не получается, то же самое
Справлюсь
23 / 23 / 5
Регистрация: 24.07.2014
Сообщений: 203
21.08.2014, 16:51     Считать массив байт в переменную типа int в обратном порядке #4
Цитата Сообщение от kvigon Посмотреть сообщение
Нужно к побитовому сдвигу прибегать?
можно и к сдвигу, только мне кажется таже ошибка будет
C++
1
int c=byData[0]+(byData[1]>>8)+(byData[2]>>16)+(byData[3]>>32);
а вообще тут кажись к ассемблеру прибегать нужно.
castaway
Эксперт С++
4880 / 3016 / 370
Регистрация: 10.11.2010
Сообщений: 11,076
Записей в блоге: 10
Завершенные тесты: 1
21.08.2014, 16:52     Считать массив байт в переменную типа int в обратном порядке #5
Какое число получается? Какой компилятор? Покажи код целиком.

Добавлено через 30 секунд
Справлюсь, <<
ISergey
Maniac
Эксперт С++
1347 / 880 / 52
Регистрация: 02.01.2009
Сообщений: 2,645
Записей в блоге: 1
21.08.2014, 16:53     Считать массив байт в переменную типа int в обратном порядке #6
C
1
int &x = (int&)byData;
Считать массив байт в переменную типа int в обратном порядке
Справлюсь
23 / 23 / 5
Регистрация: 24.07.2014
Сообщений: 203
21.08.2014, 17:05     Считать массив байт в переменную типа int в обратном порядке #7
Цитата Сообщение от castaway Посмотреть сообщение
Справлюсь, <<
почему? ведь значение увеличивается?

Добавлено через 2 минуты
ISergey, мне понравилось!
kvigon
0 / 0 / 0
Регистрация: 15.08.2014
Сообщений: 7
21.08.2014, 17:06  [ТС]     Считать массив байт в переменную типа int в обратном порядке #8
Спасибо, помогло.
Только не очень понял как это работает) объявили ссылку &x и присвоили значение, хранящееся по ссылке (int&)byData ?
John Prick
771 / 704 / 128
Регистрация: 27.07.2012
Сообщений: 2,015
Завершенные тесты: 3
21.08.2014, 17:10     Считать массив байт в переменную типа int в обратном порядке #9
C++
1
2
3
4
5
unsigned int x = 0x87D61200;
unsigned int * px = &x;
unsigned char * py = (unsigned char*)px;
std::reverse(py, py + 4);
unsigned int y = *(int*)(py);
castaway
Эксперт С++
4880 / 3016 / 370
Регистрация: 10.11.2010
Сообщений: 11,076
Записей в блоге: 10
Завершенные тесты: 1
21.08.2014, 17:32     Считать массив байт в переменную типа int в обратном порядке #10
Справлюсь, >> 8 - это деление на 256, >> 16 - это деление на 65536 и т.д.
Mr.X
Эксперт С++
3040 / 1685 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
23.08.2014, 16:11     Считать массив байт в переменную типа int в обратном порядке #11
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
/////////////////////////////////////////////////////////////////////////////////////////
//Есть массив байт:
//char byData[4] = {0x87, 0xd6, 0x12, 0x00};
//
//Нужно считать его в переменную типа int в обратном порядке, т.е. должно получится hex-число 0x0012D687
/////////////////////////////////////////////////////////////////////////////////////////
#include <algorithm>
#include <iomanip>
#include <iostream>
/////////////////////////////////////////////////////////////////////////////////////////
 
/////////////////////////////////////////////////////////////////////////////////////////
int     main()
{
    char    bytes[]     =   { 0x87, 0xd6, 0x12, 0x00 };
    int     n           =   *reinterpret_cast< int* >( bytes );
 
    std::cout   <<  std::hex
                <<  n
                <<  std::endl;
 
    system("pause");
}
John Prick
771 / 704 / 128
Регистрация: 27.07.2012
Сообщений: 2,015
Завершенные тесты: 3
23.08.2014, 23:18     Считать массив байт в переменную типа int в обратном порядке #12
Цитата Сообщение от Mr.X Посмотреть сообщение
*reinterpret_cast< int* >( bytes )
На разных архитектурах порядок байт может быть разным, и тогда "фишка" не сработает.
ValeryS
Модератор
6514 / 4980 / 460
Регистрация: 14.02.2011
Сообщений: 16,491
23.08.2014, 23:29     Считать массив байт в переменную типа int в обратном порядке #13
Цитата Сообщение от kvigon Посмотреть сообщение
C
1
2
3
4
5
int c = 0;
c += byData[3]*0x01000000;
c += byData[2]*0x00010000;
c += byData[1]*0x00000100;
c += byData[0];
здесь нужно использовать не арифметическое а логическое сложение |(ИЛИ)
и на всякий случай маску, чтобы быть точно уверенным, а не закладываться на приведение
попробуй так
C++
1
2
3
4
5
int c = 0;
c |= (byData[3]*0x01000000)&0xFF000000;
c |= (byData[2]*0x00010000)&0x00FF0000;
c |= (byData[1]*0x00000100)&0x0000FF00;
c |= (byData[0])           &0x000000FF;
Цитата Сообщение от kvigon Посмотреть сообщение
Вместо лидирующих нулей появляются ffff, и в сумме это все дает неверное значение.
это из за того что число изначально знаковое и при приведении копируется знаковый бит
Цитата Сообщение от kvigon Посмотреть сообщение
char byData[4] = {0x87, 0xd6, 0x12, 0x00};
C++
1
unsigned char  byData[4] = {0x87, 0xd6, 0x12, 0x00};
вот так должно сработать и при сложении
Mr.X
Эксперт С++
3040 / 1685 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
24.08.2014, 00:27     Считать массив байт в переменную типа int в обратном порядке #14
Цитата Сообщение от John Prick Посмотреть сообщение
На разных архитектурах порядок байт может быть разным, и тогда "фишка" не сработает.
Верное замечание. Тогда так можно:
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
/////////////////////////////////////////////////////////////////////////////////////////
//Есть массив байт:
//char byData[4] = {0x87, 0xd6, 0x12, 0x00};
//
//Нужно считать его в переменную типа int в обратном порядке, т.е. должно получится hex-число 0x0012D687
/////////////////////////////////////////////////////////////////////////////////////////
#include <algorithm>
#include <iomanip>
#include <iostream>
/////////////////////////////////////////////////////////////////////////////////////////
bool is_big_endian()
{
    int     i           =   1;
    return  *(char*)&i  ==  0;
}
/////////////////////////////////////////////////////////////////////////////////////////
int     main()
{
    char    bytes[]     =   { 0x87, 0xd6, 0x12, 0x00 };
 
    if  (
            is_big_endian()
        )
    {
        std::swap( bytes[0], bytes[3] );
        std::swap( bytes[1], bytes[2] );
    }
 
    int     n   =   *reinterpret_cast< int* >( bytes );
 
    std::cout   <<  std::hex
                <<  n
                <<  std::endl;
 
    system("pause");
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.08.2014, 00:37     Считать массив байт в переменную типа int в обратном порядке
Еще ссылки по теме:

C++ Как считать из файла в массив типа int
Ввести массив с клавиатуры, считать сумму элементов, и вывести в обратном порядке C++
Как считать из файла текст в двумерный массив типа char и отсортировать в алф. порядке? C++
C++ Считать числа через пробел в обратном порядке
Как передать в stringstream переменную типа int? C++

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

Или воспользуйтесь поиском по форуму:
John Prick
771 / 704 / 128
Регистрация: 27.07.2012
Сообщений: 2,015
Завершенные тесты: 3
24.08.2014, 00:37     Считать массив байт в переменную типа int в обратном порядке #15
Интересное решение.
Yandex
Объявления
24.08.2014, 00:37     Считать массив байт в переменную типа int в обратном порядке
Ответ Создать тему
Опции темы

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