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

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

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

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

30.01.2012, 19:14. Просмотров 2310. Ответов 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));
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.01.2012, 19:14
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Получить массив байтов из int32_t (C++):

Получить число из байтов - C++
добрый день, получаю байты числа вот так: int number; int bytes; cin&gt;&gt;number; bytes=(number&amp;0x000000FF); ...

Сравнение int32_t и int64_t - C++
#include &lt;stdint.h&gt; int main() { int32_t a = 0; int64_t b = 0xFFFFFFFF; b = b + 1; a = b;

Запись байтов в массив char - C++
Есть переменная типа char ch как можно записать туда числа в таком порядке в какой я хочу, у меня есть задача запихать в первые 2 байта...

Загрузка файла в массив байтов - C++
не подскажите как можно загрузить файл и сохранить его не в файл на пк, а в переменную байтов? т.е сохранить в массив байтов

Запись аудиофайла в массив байтов - C++
привет!) подскажите пожалуйста, как записать аудио файл в массив байтов??? заранее спасибо

Запись звука в массив байтов - C++
Если в кратце, то... то мне нужно получить байты с микрофона и записать из в массив/байтов. Я уже облазал пол инета в поиска нужных...

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

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

Главное не забывать - часто бывает, что байты в инте переставлены... См. архитектуры.
1
retmas
Жарю без масла
863 / 745 / 168
Регистрация: 13.01.2012
Сообщений: 1,702
30.01.2012, 19:20 #3
BE или LE?
0
Teravisor
31 / 31 / 3
Регистрация: 07.08.2011
Сообщений: 89
30.01.2012, 19:28 #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);
Незаметная больно бьющая ошибка...
1
Driim
7 / 7 / 0
Регистрация: 29.03.2011
Сообщений: 81
30.01.2012, 23:07  [ТС] #5
BE или LE определяет где находятся младшие(старшие) разряды, к счастью в моем конкретном случае это не важно =) хотя всегда полезно себе напомнить!
Незаметная больно бьющая ошибка...
Очень больно бьющая

Воспользуюсь первым вариантом преобразования!
Всем спасибо!
0
30.01.2012, 23:07
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.01.2012, 23:07
Привет! Вот еще темы с ответами:

Как правильно объявить массив байтов? - C++
Как правильно объявить массив байтов? Надо ли вручную выставлять ему размер после &quot;GetBitmapBits&quot;? Я делал так: extern...

Перевод массива символов в массив байтов - C++
Допустим читаем из txt набор символов 4e5he56R8G потом превращаем его в байты, таким образом. Два символа прочитали перевели в байты,...

Ошибка C2371 int32_t: переопределение, различные базовые типы - C++
Разбираюсь в чужем проекте. Проект работал в Qt и возможно на Linux. Хочу запустить его в VS2015. От всех ошибок кроме одной смог...

Выделить память под массив размера 2^64 байтов - C++
Требуется выделить память под массив размера 2^64 байтов. Как порекомендуете решать данную задачу?


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

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

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