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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 18, средняя оценка - 4.83
Driim
7 / 7 / 0
Регистрация: 29.03.2011
Сообщений: 81
#1

Получить массив байтов из int32_t - C++

30.01.2012, 19:14. Просмотров 2276. Ответов 4
Метки нет (Все метки)

Собственно сабж!

Самое элегантное решение, но как мне кажется не совсем безопасное это что-то типа этого
C++
1
2
int32_t i;
reinterpret_cast<char *>(&i);
или же

C++
1
2
3
4
5
6
7
8
struct arr{
char a1; // либо int8_t
char a2;
char a3;
char a4;
};
 
struct *arr=reinterpret_cast<struct arr*>(i);
массив вроде будет выравнен

Есть идеи?

Добавлено через 3 минуты
Да что-то я перемудрил, можно и так, но какой способ лучше?


C++
1
2
3
4
5
6
7
8
9
//int to uchar
bool int2bytes(int &i, uchar *buf){
    memcpy(buf,&i,sizeof(int));
    return true;
}
//uchat to int
void bytes2int(uchar *buf, int &i){
    memcpy(&i,buf,sizeof(int));
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.01.2012, 19:14     Получить массив байтов из int32_t
Посмотрите здесь:
C++ Получить число из байтов
Сравнение int32_t и int64_t C++
C++ Запись звука в массив байтов
Загрузка файла в массив байтов C++
запись аудиофайла в массив байтов C++
Как правильно объявить массив байтов? C++
C++ Перевод массива символов в массив байтов
Ошибка C2371 int32_t: переопределение, различные базовые типы C++
C++ Выделить память под массив размера 2^64 байтов
C++ Какой заголовочный файл нужно подключить чтобы стали доступны int32_t size_t ?
Массив: Получить массив из максимальных значений каждого из входных массивов. C++
Массив: Получить массив, который содержит все элементы исходного массива, кратные трем C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Teravisor
30 / 30 / 3
Регистрация: 07.08.2011
Сообщений: 89
30.01.2012, 19:18     Получить массив байтов из int32_t #2
Первые два лучше т.к. мы не копируем память, а просто говорим, что тут смотри (char*) вместо (int*).
Я обычно пишу
C++
1
2
int32_t i;
char* temp=(char*)(&i);
и обращаюсь к этому как к массиву из sizeof(int32_t) чаров. Можно temp не заводить, просто везде писать эту страшненькую конструкцию.
Да, не безопасно. Мы можем забыв, что 0-3 - наш массив, обратиться к 4му элементу и получить сегфолт, Heap Corruption Detected, или просто крякозябру, как повезёт и смотря откуда смотрим. Ну дак не надо этого делать наверно?

Второй вариант тоже можно, но требует задавать структуры - часто лень.
Третий не надо т.к. лишние 4 байта куда-то копируем... Зачем?

Главное не забывать - часто бывает, что байты в инте переставлены... См. архитектуры.
retmas
Жарю без масла
859 / 741 / 164
Регистрация: 13.01.2012
Сообщений: 1,694
30.01.2012, 19:20     Получить массив байтов из int32_t #3
BE или LE?
Teravisor
30 / 30 / 3
Регистрация: 07.08.2011
Сообщений: 89
30.01.2012, 19:28     Получить массив байтов из int32_t #4
C++
1
2
3
4
5
6
7
8
int num = 1;
 
if(*(char *)&num == 1) {
  printf("Little-Endian\n");
}
else {
  printf("Big-Endian\n");
}
Это одновременно и способ проверки на какой вы системе, и подсказка что гуглить, чтобы понять.

Добавлено через 3 минуты
Цитата Сообщение от Driim Посмотреть сообщение
struct *arr=reinterpret_cast<struct arr*>(i);
Вы наверно имели ввиду
C++
1
struct *arr=reinterpret_cast<struct arr*>(&i);
Незаметная больно бьющая ошибка...
Driim
7 / 7 / 0
Регистрация: 29.03.2011
Сообщений: 81
30.01.2012, 23:07  [ТС]     Получить массив байтов из int32_t #5
BE или LE определяет где находятся младшие(старшие) разряды, к счастью в моем конкретном случае это не важно =) хотя всегда полезно себе напомнить!
Незаметная больно бьющая ошибка...
Очень больно бьющая

Воспользуюсь первым вариантом преобразования!
Всем спасибо!
Yandex
Объявления
30.01.2012, 23:07     Получить массив байтов из int32_t
Ответ Создать тему
Опции темы

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