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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 16, средняя оценка - 4.75
sergey.shuvalov
-2 / 1 / 0
Регистрация: 06.11.2011
Сообщений: 263
#1

записать по-битого один short int в два char - C++

30.06.2013, 12:12. Просмотров 2073. Ответов 12
Метки нет (Все метки)

Здрасьте, всем.
Записать побитого два char в один short int это:
C++
1
2
3
4
char char1;
char char2;
short int s;
s=char1<<8|char2;
А как записать побитого один short int в два char ?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.06.2013, 12:12     записать по-битого один short int в два char
Посмотрите здесь:

дан массив char[22] как превратить отдельные байты в int, short C++
Создать объединение, что содержит элементы типов char int short fload long string C++
C++ Напишите программу, которая будет определять размер для данных (int, char, long, double, short, unsigned, float) и выводить информацию
C++ Размер для данных (int, char, long, double, short, unsigned, float)
C++ Разница int, short, unsigned int, unsigned short
C++ Как записать Short в два char'a?
Преобразование 2-х char в один short int C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
drdrink
39 / 39 / 1
Регистрация: 13.05.2013
Сообщений: 103
30.06.2013, 17:48     записать по-битого один short int в два char #2
sergey.shuvalov, а разве так правильно будет когда мы в один short int пытаемся записать 2 char, по-моему когда ты сдвигаешь char1 на 8, то поскольку размер char 8 бит, то мы тупо затрём char1 то есть там будет 0, а потом дизъюнкцией запишем в него char2 и всё это присвоим s, наверно так надо сделать:

C++
1
2
3
char char1, char2;
short int s = char1;
s = (s << 8) | char2;
Добавлено через 2 минуты
sergey.shuvalov, а чтобы записать в 2 char
C++
1
2
3
4
char char1, char2;
short int s;
char1 = s >> 8;
char2 = (s << 8) >> 8;
Kuzia domovenok
 Аватар для Kuzia domovenok
1886 / 1741 / 117
Регистрация: 25.03.2012
Сообщений: 5,916
Записей в блоге: 1
30.06.2013, 19:14     записать по-битого один short int в два char #3
для таких случаев существуют union ы
C++
1
2
3
4
5
6
7
union{
  char bytes[2];
  short int data;
}word16;
word16.data=s;
char1=word16.bytes[0];
char2=word16.bytes[1];
sergey.shuvalov
-2 / 1 / 0
Регистрация: 06.11.2011
Сообщений: 263
30.06.2013, 21:54  [ТС]     записать по-битого один short int в два char #4
У меня получилось короче.

C++
1
2
3
4
char char1, char2;
short int s;
char1 = s ;
char2 = s >> 8;
Praktolock
 Аватар для Praktolock
65 / 65 / 1
Регистрация: 29.11.2011
Сообщений: 300
01.07.2013, 09:50     записать по-битого один short int в два char #5
C++
1
2
3
4
5
6
7
8
char char1, char2;
short int s;
 
char1=*((char*)&s);
char2=*(((char*)&s)+1);
 
*((char*)&s)=char1;
*(((char*)&s)+1)=char2;
мне нравиться с указателями всякие такие штуки проделывать

Добавлено через 2 минуты
или еще лучше
C++
1
2
3
4
5
6
7
8
char char1, char2;
short int s;
 
char1=((char*)&s)[0];
char2=((char*)&s)[1];
 
((char*)&s)[0]=char1;
((char*)&s)[1]=char2;
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
17185 / 5439 / 337
Регистрация: 30.03.2009
Сообщений: 14,746
Записей в блоге: 26
01.07.2013, 10:31     записать по-битого один short int в два char #6
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
для таких случаев существуют union ы
C++
1
2
3
4
5
6
7
union{
  char bytes[2];
  short int data;
}word16;
word16.data=s;
char1=word16.bytes[0];
char2=word16.bytes[1];
Цитата Сообщение от Praktolock Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
char char1, char2;
short int s;
 
char1=*((char*)&s);
char2=*(((char*)&s)+1);
 
*((char*)&s)=char1;
*(((char*)&s)+1)=char2;
мне нравиться с указателями всякие такие штуки проделывать
Эти два кода являются НЕпереносимыми. Они дадут разные результаты на машинах little-endian и big-endian. Бестолковые преподаватели об этом навряд ли задумаются, но для самообразования это знать полезно
Praktolock
 Аватар для Praktolock
65 / 65 / 1
Регистрация: 29.11.2011
Сообщений: 300
01.07.2013, 10:48     записать по-битого один short int в два char #7
Цитата Сообщение от Evg Посмотреть сообщение
Эти два кода являются НЕпереносимыми
Ну сделай макрос из этого, если хочешь перенести, только копирайты укажи xD

Добавлено через 6 минут
какая может понадобитсься переносимость при такой постановке задачи, как я понял совершенно неважно какой из двух байтов окажется страшим
а как с переносимостью такого варианта:
C++
1
2
3
4
5
6
7
char char1, char2;
unsigned short s;
 
char1=s/256;
char2=(s-((unsigned short)char1)*256);
 
s=((unsigned short)char1)*256+char2;
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
17185 / 5439 / 337
Регистрация: 30.03.2009
Сообщений: 14,746
Записей в блоге: 26
01.07.2013, 15:22     записать по-битого один short int в два char #8
Praktolock, мои посты можешь не читать, тебе это ни к чему. А вот кому-то они могут оказаться полезными
Praktolock
 Аватар для Praktolock
65 / 65 / 1
Регистрация: 29.11.2011
Сообщений: 300
01.07.2013, 15:27     записать по-битого один short int в два char #9
Я просто сказал что думаю, извини если про макрос тебе показалось подколкой, слишком тонкая шутка. А вот по поводу последнего варианта мне действительно интересно мнение эксперта - что насчёт переносимости такого варианта
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
17185 / 5439 / 337
Регистрация: 30.03.2009
Сообщений: 14,746
Записей в блоге: 26
01.07.2013, 17:08     записать по-битого один short int в два char #10
Цитата Сообщение от Praktolock Посмотреть сообщение
Я просто сказал что думаю, извини если про макрос тебе показалось подколкой, слишком тонкая шутка. А вот по поводу последнего варианта мне действительно интересно мнение эксперта - что насчёт переносимости такого варианта
Он по своей сути совпадает с вариантом из поста #2. Варианты из постов #2 и #7 работают исключительно над значениями, а потому являются переносимыми. Способ хранения значений в памяти (endian) учитывает компилятор. Варианты из постов #3 и #5 пытаются учесть способ хранения значений в памяти, но делают это не до конца, т.к. учитывают только little-endian расположение, а потому являются НЕпереносимыми

Варианты #3 и #5 можно допилить до переносимого варианта. Нужно под соответствующими макросам учесть правильный endian и написать два варианта кода. С учётом того, что нет какого-то стандартного способа в определении макросов, то в таких случаях приходится вручную учитывать каждую платформу, на которой предполагается запускать программу. Пример см. в http://www.cyberforum.ru/blogs/18334/blog100.html раздел 5.2
Praktolock
 Аватар для Praktolock
65 / 65 / 1
Регистрация: 29.11.2011
Сообщений: 300
01.07.2013, 17:14     записать по-битого один short int в два char #11
но ведь там используются сдвиги, при этом как раз не учитывается в какую сторону надо сдвигать, т.е. с какой стороны находится младший а с какой старший байт, а вмоём последнем варианте только приведения типов, деления и умножения стандартных типов - вроде-бы максимально кросс-платформенно
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
17185 / 5439 / 337
Регистрация: 30.03.2009
Сообщений: 14,746
Записей в блоге: 26
01.07.2013, 17:20     записать по-битого один short int в два char #12
Цитата Сообщение от Praktolock Посмотреть сообщение
но ведь там используются сдвиги, при этом как раз не учитывается в какую сторону надо сдвигать, т.е. с какой стороны находится младший а с какой старший байт, а вмоём последнем варианте только приведения типов, деления и умножения стандартных типов - вроде-бы максимально кросс-платформенно
Да. Но сдвигают ЗНАЧЕНИЕ. Значение числа не зависит от того, в каком endian'е оно хранится. От endian'а зависит только образ этого значения в памяти (т.е. в каком порядке в памяти будут лежать запчасти от значения). Другими словами, 100+200 будет равняться 300 независимо от того, какой endian у процессора. Но вот образ этих значений в памяти при побайтном дампе будет различаться для little-endian и big-endian

Добавлено через 29 секунд
Результат работы сдвигов от endian'а не зависит
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.07.2013, 17:20     записать по-битого один short int в два char
Еще ссылки по теме:

C++ Как в выделенную память записать поочередно число int, массив char[n], и еще число int
C++ Как записать и прочитать int (4 byte) из char[]
Char, short, int, long: какой тип выбрать? C++
Реализация функции char *padl(const char *string, int len, int c=' ') C++
Двоичный дамп short и char выводится как int C++

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

Или воспользуйтесь поиском по форуму:
Praktolock
 Аватар для Praktolock
65 / 65 / 1
Регистрация: 29.11.2011
Сообщений: 300
01.07.2013, 17:20     записать по-битого один short int в два char #13
Цитата Сообщение от Evg Посмотреть сообщение
Результат работы сдвигов от endian'а не зависит
о, точно)
Yandex
Объявления
01.07.2013, 17:20     записать по-битого один short int в два char
Ответ Создать тему
Опции темы

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