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

Четыре байта в один int

20.03.2016, 19:46. Просмотров 1286. Ответов 15
Метки нет (Все метки)

У меня есть
C++
1
char bytes[] = { 0xCF, 0xA1, 0x01, 0x00 };
каким образом я могу, хм, "упаковать" эти четыре байта в один int?
0
Лучшие ответы (1)
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.03.2016, 19:46
Ответы с готовыми решениями:

Собрать четыре байта в одно число
Есть ли какая-то штатная функция формирующая из четырех байт одно 32-битовое число? Под Виндой есть...

Зачем биты нужны это меньше байтов но int 32 бита но я не допер зачем это нужно это 4 байта то есть int не может больше 4 байт весить?
Вот еще один вопрос зачем биты нужны это меньше байтов но int 32 бита но я не допер зачем это...

Определить количество ведущих нулей старшего байта short int
Представить программу, позволяющую для заданного целочисленного объекта short int определить...

Как заполнить один int пустой массив другим int массивом ?
Можно пример кода :)

Присвоить переменной Char значение третьего байта переменно типа Int
всем привет, на одном собеседовании передо мной поставили следующую задачу, присвоить переменной...

15
Байт
Эксперт C
21155 / 13347 / 2808
Регистрация: 24.12.2010
Сообщений: 28,138
20.03.2016, 19:57 2
C++
1
2
unsigned  int I = 0;
for(int j=0; j<4; j++) I = (I<<8) + bytes[j];
Добавлено через 1 минуту

Не по теме:

Не мог пройти мимо:)

0
iars
6 / 6 / 7
Регистрация: 19.03.2016
Сообщений: 50
20.03.2016, 20:05  [ТС] 3
Байт, или я вас неправильно понял, или вы неправильно написали, но
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int to_int(char *bytes) {
    int r = 0;
    
    for(int i = 0; i < 4; i++)
        r = (r << 8) + bytes[i];
    
    return r;
}
 
int main() {
    char bytes[] = { 0xcf, 0xa1, 0x01, 0x00 };
    int f = to_int(bytes);
    
    std::cout << f << std::endl;
    
    return 0;
}
выдаёт -828309248, хотя должно быть 106959. В чём ошибка?
0
zss
Модератор
Эксперт С++
8496 / 7494 / 4638
Регистрация: 18.12.2011
Сообщений: 19,824
Завершенные тесты: 1
20.03.2016, 20:06 4
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
#include <iomanip>
using namespace std;
union BI
{
    unsigned char bytes[4];
    unsigned  int I;
};
int main()
{
    BI bi= { 0xCF, 0xA1, 0x01, 0x00 };
    cout<<bi.I<<endl;
    system("pause");
    return 0;
}
0
20.03.2016, 20:06
iars
6 / 6 / 7
Регистрация: 19.03.2016
Сообщений: 50
20.03.2016, 20:10  [ТС] 5
zss, неужто подхода без юнионов нет?
0
Байт
Эксперт C
21155 / 13347 / 2808
Регистрация: 24.12.2010
Сообщений: 28,138
20.03.2016, 20:18 6
iars, я не зря написал unsigned
И направление паковки у нас разное... Так, как вы пакуете, надо
C++
1
2
unsigned  int I = 0;
for(int j=3; j>=0; j++) I = (I<<8) + bytes[j];
Добавлено через 4 минуты
Цитата Сообщение от iars Посмотреть сообщение
неужто подхода без юнионов нет?
Есть. И они вам были предъявлены.
Кстати, при данном наборе байтов (последний меньше 0x80) и вашем способе паковки, можно и без unsigned
0
iars
6 / 6 / 7
Регистрация: 19.03.2016
Сообщений: 50
20.03.2016, 20:22  [ТС] 7
Байт, там big-endian должен быть, паковать с конца незачем же. к тому же получается опять не то, 41167 вместо того, что на картинке.
0
Миниатюры
Четыре байта в один int  
iars
6 / 6 / 7
Регистрация: 19.03.2016
Сообщений: 50
20.03.2016, 20:26  [ТС] 8
может, стоит полностью обрисовать мою задачу:
эти четыре байта - "аргументы" к опкоду некоего процессора, который я пытаюсь эмулировать (в данном случае - C0 - положить int в регистр R0). вот это и есть тот самый int, как он выглядит в памяти.
0
nd2
3090 / 2587 / 1131
Регистрация: 29.01.2016
Сообщений: 8,673
20.03.2016, 20:27 9
Лучший ответ Сообщение было отмечено iars как решение

Решение

C++
1
2
3
4
5
6
    char bytes[] = { 0xCF, 0xA1, 0x01, 0x00 };
    unsigned  int I = 0;
    char* p = (char*)&I;
    for(int j = 0; j < 4; j++, ++p) 
        *p = bytes[j];
    std::cout << I << std::endl;
1
iars
6 / 6 / 7
Регистрация: 19.03.2016
Сообщений: 50
20.03.2016, 20:29  [ТС] 10
nd2, чёрт, мне следовало самому додуматься до указателей. спасибо!
0
ValeryS
Модератор
7839 / 5826 / 761
Регистрация: 14.02.2011
Сообщений: 20,017
Завершенные тесты: 1
20.03.2016, 20:35 11
Цитата Сообщение от iars Посмотреть сообщение
неужто подхода без юнионов нет?
есть но оно самое правильное,
вот еще одно решение
C++
1
2
3
char bytes[] = { 0xCF, 0xA1, 0x01, 0x00 };
int *A=(int*) bytes;
int B=*A;
оно же, но короче
C++
1
2
char bytes[] = { 0xCF, 0xA1, 0x01, 0x00 };
int B=*((int*) bytes);
но значение будет сильно зависеть от представления int внутри машины, младший байт слева или справа
2
iars
6 / 6 / 7
Регистрация: 19.03.2016
Сообщений: 50
20.03.2016, 20:38  [ТС] 12
ValeryS, благодарю. кстати, оффтоп, но всё же: есть ли способ программно узнать, где младший байт? вдруг понадобится когда-нибудь.
0
nd2
3090 / 2587 / 1131
Регистрация: 29.01.2016
Сообщений: 8,673
20.03.2016, 20:46 13
Ещё вариант:
C++
1
2
3
4
    char bytes[] = { 0xCF, 0xA1, 0x01, 0x00 };
    unsigned  int I = 0;
    memcpy(&I, bytes, 4);
    std::cout << I << std::endl;
0
ValeryS
Модератор
7839 / 5826 / 761
Регистрация: 14.02.2011
Сообщений: 20,017
Завершенные тесты: 1
20.03.2016, 20:50 14
iars, я как то не задавался этим вопросом,всегда знаю платформу на которой работаю
подумай все таки насчет union
во первых памяти меньше например у меня в первом решении три области памяти один массив другой указатель третий int во втором две области памяти массив и int
А при помощи объединения одна область памяти, массив читается как int и соответственно наоборот
во вторых, здесь правда не уверен если, что zss поправит, компилятор сам должен решить порядок представления чисел

Добавлено через 3 минуты
Цитата Сообщение от iars Посмотреть сообщение
есть ли способ программно узнать, где младший байт?
вот придумал такой вариант
C++
1
2
3
4
5
6
int A=1;
char* tmpBuf=(char *)&A;
if(tmpBuf[0]==1)
 //младший слева
else
 // младший справа
0
iars
6 / 6 / 7
Регистрация: 19.03.2016
Сообщений: 50
20.03.2016, 20:56  [ТС] 15
ValeryS, оно же только конкретно если A = 1. хотя неважно, всё равно платформа у меня внезапно не изменится. я на к слову спросил, one can't be sure, как говорится.
0
ValeryS
Модератор
7839 / 5826 / 761
Регистрация: 14.02.2011
Сообщений: 20,017
Завершенные тесты: 1
20.03.2016, 21:07 16
Цитата Сообщение от iars Посмотреть сообщение
ValeryS, оно же только конкретно если A = 1.
ну да
это так скажем тестовая переменная нужно для определения
заводишь себе переменную которая определяет направления
C++
1
2
3
4
5
6
7
int A=1;
bool big_endian;
char* tmpBuf=(char *)&A;
if(tmpBuf[0]==1)
 big_endian=false;
else
 big_endian=true;
тоже, но без тавтологии
C++
1
2
3
4
int A=1;
bool big_endian;
char* tmpBuf=(char *)&A;
 big_endian=tmpBuf[0]!=1;
потом эту переменную где нибудь используешь, правда где я придумать не могу
0
20.03.2016, 21:07
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.03.2016, 21:07

Для (short int) выполнить перестановку младшей и старшей тетрад его младшего байта
Представить программу, позволяющую для заданного целочисленного объекта (short int) выполнить...

Поместить четыре числа от 1 до 4 в один байт
Здравствуйте, есть такое задание: Есть 4 переменных типа int, каждой переменной присвоено цифра от...

Почему диапазон значений у типа float больше, чем у типа int, если они оба занимают 4 байта?
Почему диапазон значений флоат больше чем у инта, если они оба занимают 4 байта? Вроде слышал...


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

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

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