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

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

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

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

21.08.2014, 16:24. Просмотров 1543. Ответов 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 в обратном порядке (C++):

Как считать из файла в массив типа int - C++
Подскажите как считать из файла в массив nbgf, если есть разделитель | ifstream loader("temp.txt"); if (loader.is_open()){ char...

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

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

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

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

Записать адрес переменной произвольного типа в переменную типа int - C++
Здравствуйте, есть структура __packed struct myStruct{ uint32 HisCh; uint32 sNo; uint16 tNo; uint32 reserv; };

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
castaway
Эксперт С++
4884 / 3020 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 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 / 5
Регистрация: 24.07.2014
Сообщений: 203
21.08.2014, 16:51 #4
Цитата Сообщение от kvigon Посмотреть сообщение
Нужно к побитовому сдвигу прибегать?
можно и к сдвигу, только мне кажется таже ошибка будет
C++
1
int c=byData[0]+(byData[1]>>8)+(byData[2]>>16)+(byData[3]>>32);
а вообще тут кажись к ассемблеру прибегать нужно.
0
castaway
Эксперт С++
4884 / 3020 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
21.08.2014, 16:52 #5
Какое число получается? Какой компилятор? Покажи код целиком.

Добавлено через 30 секунд
Справлюсь, <<
1
ISergey
Maniac
Эксперт С++
1374 / 885 / 52
Регистрация: 02.01.2009
Сообщений: 2,658
Записей в блоге: 1
21.08.2014, 16:53 #6
C
1
int &x = (int&)byData;
Считать массив байт в переменную типа int в обратном порядке
3
Справлюсь
23 / 23 / 5
Регистрация: 24.07.2014
Сообщений: 203
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
801 / 734 / 145
Регистрация: 27.07.2012
Сообщений: 2,107
Завершенные тесты: 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
Эксперт С++
4884 / 3020 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
21.08.2014, 17:32 #10
Справлюсь, >> 8 - это деление на 256, >> 16 - это деление на 65536 и т.д.
1
Mr.X
Эксперт С++
3049 / 1694 / 265
Регистрация: 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
801 / 734 / 145
Регистрация: 27.07.2012
Сообщений: 2,107
Завершенные тесты: 3
23.08.2014, 23:18 #12
Цитата Сообщение от Mr.X Посмотреть сообщение
*reinterpret_cast< int* >( bytes )
На разных архитектурах порядок байт может быть разным, и тогда "фишка" не сработает.
1
ValeryS
Модератор
6631 / 5038 / 466
Регистрация: 14.02.2011
Сообщений: 16,849
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
Эксперт С++
3049 / 1694 / 265
Регистрация: 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
801 / 734 / 145
Регистрация: 27.07.2012
Сообщений: 2,107
Завершенные тесты: 3
24.08.2014, 00:37 #15
Интересное решение.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.08.2014, 00:37
Привет! Вот еще темы с ответами:

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

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

Распознать строку в переменную типа int - C++
сорри если такие были задачи но,по поисковику слишком долго искать, 1)На входе строка с числом в шестнадцатиричной форме. Распознать...

Ввод символа в переменную типа INT - C++
Доброго времени суток. Подскажите самый эффективный способ борьбы с неверным вводом данных пользователем. А именно когда пользователя...


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

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

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