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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.89
kvigon
0 / 0 / 0
Регистрация: 15.08.2014
Сообщений: 7
21.08.2014, 16:24     Считать массив байт в переменную типа int в обратном порядке #1
Есть массив байт:
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, и в сумме это все дает неверное значение.
Как правильно сдвинуть байты? Нужно к побитовому сдвигу прибегать? вроде ж без него можно, только я где-то косячу
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
castaway
Эксперт С++
4841 / 2980 / 367
Регистрация: 10.11.2010
Сообщений: 11,012
Записей в блоге: 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
Эксперт С++
4841 / 2980 / 367
Регистрация: 10.11.2010
Сообщений: 11,012
Записей в блоге: 10
Завершенные тесты: 1
21.08.2014, 16:52     Считать массив байт в переменную типа int в обратном порядке #5
Какое число получается? Какой компилятор? Покажи код целиком.

Добавлено через 30 секунд
Справлюсь, <<
ISergey
Maniac
Эксперт С++
 Аватар для ISergey
1331 / 864 / 50
Регистрация: 02.01.2009
Сообщений: 2,622
Записей в блоге: 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
754 / 687 / 123
Регистрация: 27.07.2012
Сообщений: 1,974
Завершенные тесты: 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
Эксперт С++
4841 / 2980 / 367
Регистрация: 10.11.2010
Сообщений: 11,012
Записей в блоге: 10
Завершенные тесты: 1
21.08.2014, 17:32     Считать массив байт в переменную типа int в обратном порядке #10
Справлюсь, >> 8 - это деление на 256, >> 16 - это деление на 65536 и т.д.
Mr.X
Эксперт С++
 Аватар для Mr.X
2799 / 1575 / 246
Регистрация: 03.05.2010
Сообщений: 3,656
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
754 / 687 / 123
Регистрация: 27.07.2012
Сообщений: 1,974
Завершенные тесты: 3
23.08.2014, 23:18     Считать массив байт в переменную типа int в обратном порядке #12
Цитата Сообщение от Mr.X Посмотреть сообщение
*reinterpret_cast< int* >( bytes )
На разных архитектурах порядок байт может быть разным, и тогда "фишка" не сработает.
ValeryS
Модератор
6374 / 4840 / 441
Регистрация: 14.02.2011
Сообщений: 16,043
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
Эксперт С++
 Аватар для Mr.X
2799 / 1575 / 246
Регистрация: 03.05.2010
Сообщений: 3,656
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 в обратном порядке
Еще ссылки по теме:

Присвоить переменной типа int содержимое четырёх байт из массива C++
C++ Почему запись int в файл происходит в обратном порядке?
C++ Как считать из файла в массив типа int

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

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

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