Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
kvigon
0 / 0 / 0
Регистрация: 15.08.2014
Сообщений: 7
1

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

21.08.2014, 16:24. Просмотров 2043. Ответов 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, и в сумме это все дает неверное значение.
Как правильно сдвинуть байты? Нужно к побитовому сдвигу прибегать? вроде ж без него можно, только я где-то косячу
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.08.2014, 16:24
Ответы с готовыми решениями:

Как считать из файла в массив типа int
Подскажите как считать из файла в массив nbgf, если есть разделитель |...

Ввести массив с клавиатуры, считать сумму элементов, и вывести в обратном порядке
Ввести массив с клавиатуры, считать сумму элементов, и вывести в обратном...

Поместить двоичный код, в веденной строке, в переменную типа int и unsigned int.
Пользователь вводит двоичную строку (32 символа). Поместить двоичный код, в...

Передать массив элементов(типа int) объекта, в функцию из массивов(типа int)
Представьте такую ситуацию. Есть у вас массив чисел: Mass И вы хотите...

Как считать из файла текст в двумерный массив типа char и отсортировать в алф. порядке?
Постановка задачи: Исходные данные считать из текстового файла через отдельную...

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

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

Добавлено через 2 минуты
ISergey, мне понравилось!
0
kvigon
0 / 0 / 0
Регистрация: 15.08.2014
Сообщений: 7
21.08.2014, 17:06  [ТС] 8
Спасибо, помогло.
Только не очень понял как это работает) объявили ссылку &x и присвоили значение, хранящееся по ссылке (int&)byData ?
0
John Prick
837 / 768 / 258
Регистрация: 27.07.2012
Сообщений: 2,180
Завершенные тесты: 3
21.08.2014, 17:10 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);
0
castaway
Эксперт С++
4934 / 3039 / 455
Регистрация: 10.11.2010
Сообщений: 11,119
Записей в блоге: 10
Завершенные тесты: 1
21.08.2014, 17:32 10
Справлюсь, >> 8 - это деление на 256, >> 16 - это деление на 65536 и т.д.
1
Mr.X
Эксперт С++
3182 / 1709 / 435
Регистрация: 03.05.2010
Сообщений: 3,867
23.08.2014, 16:11 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");
}
0
John Prick
837 / 768 / 258
Регистрация: 27.07.2012
Сообщений: 2,180
Завершенные тесты: 3
23.08.2014, 23:18 12
Цитата Сообщение от Mr.X Посмотреть сообщение
*reinterpret_cast< int* >( bytes )
На разных архитектурах порядок байт может быть разным, и тогда "фишка" не сработает.
1
ValeryS
Модератор
7316 / 5559 / 704
Регистрация: 14.02.2011
Сообщений: 18,853
23.08.2014, 23:29 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};
вот так должно сработать и при сложении
0
Mr.X
Эксперт С++
3182 / 1709 / 435
Регистрация: 03.05.2010
Сообщений: 3,867
24.08.2014, 00:27 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");
}
3
John Prick
837 / 768 / 258
Регистрация: 27.07.2012
Сообщений: 2,180
Завершенные тесты: 3
24.08.2014, 00:37 15
Интересное решение.
0
24.08.2014, 00:37
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.08.2014, 00:37

Записать адрес переменной произвольного типа в переменную типа int
Здравствуйте, есть структура __packed struct myStruct{ uint32 HisCh; ...

Есть переменная типа char содержащая цифру; как записать это значение в переменную типа int?
Пожалуйста, напомните стандартную функцию

Присвоить переменной типа int содержимое четырёх байт из массива
Есть массив байт. Нужно выбрать из него четыре байта подряд (например, со...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

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