Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Преобразование типов


Автор: kurlyak 29.7.2017, 17:48
привет народ. есть такой код - в массив чисел BYTE загружаются байты (для примера произвольные числа), и мне надо взять ячейку из массива байт и след. три ячейки вместе с этой преобразовать в INT (четыре байта размер). я написал такой код но он не работает. фактически мне надо 4 - ре последовательных байта из массива BYTE преобразовать в значение INT. кто знает как?

Код

BYTE szBuff[256];

UINT n_count = 0;

//заполняем массив байтами
UINT i = 0;
while ( i < 256)
{
szBuff[i] = n_count;
szBuff[i+1]= n_count;
szBuff[i+2]= n_count;
szBuff[i+3]= n_count;

n_count += 1;
i+=4;
}



//берем ячейки 4, 5, 6, 7 и преобразуем в INT

INT my_val = szBuff[4];

my_val << 1;
my_val =  szBuff[5];

my_val << 2;
my_val =  szBuff[6];

my_val << 3;
my_val =  szBuff[7];

//после этого кода 4- ре байта переменной INT my_val
//должны содержать четыре единицы из массива байтов
//но этого не происходит

CString sz;
sz.Format("%d", my_val);

AfxMessageBox(sz);

Автор: borisbn 31.7.2017, 09:00
1) Сдвигать надо не на 1,2 и 3, а на 8, 16 и 24
2) В my_val надо не присваивать очередной байт, а делать побитовое ИЛИ |
Код
INT my_val = szBuff[4];
my_val << 8;
my_val |=  szBuff[5];
my_val << 16;
my_val |=  szBuff[6];
my_val << 24;
my_val |=  szBuff[7];


Однако, таким образом Вы получите INT в https://en.wikipedia.org/wiki/Endianness. Чтобы получить Little Endian, нужно помещать байты в обратном порядке:
Код
INT my_val = szBuff[7];
my_val << 8;
my_val |=  szBuff[6];
my_val << 16;
my_val |=  szBuff[5];
my_val << 24;
my_val |=  szBuff[4];


А можно ещё сделать так:
Код
INT my_val = *(INT*)( & szBuff[ 4 ] );


Автор: volatile 31.7.2017, 10:00
Цитата(borisbn @ 31.7.2017,  09:00)
my_val << 8;

Всё верно
небольшая описка только
Код

my_val <<= 8;

и сдвигать каждый раз на 8.

Автор: borisbn 31.7.2017, 22:07
volatile, Вы, как всегда, правы (посыпая голову пеплом)

Автор: kurlyak 11.8.2017, 12:20
спасибо огромное. разобрался.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)