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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 16, средняя оценка - 4.75
sergey.shuvalov
-2 / 1 / 0
Регистрация: 06.11.2011
Сообщений: 249
30.06.2013, 12:12     записать по-битого один short int в два char #1
Здрасьте, всем.
Записать побитого два char в один short int это:
C++
1
2
3
4
char char1;
char char2;
short int s;
s=char1<<8|char2;
А как записать побитого один short int в два char ?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
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
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 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
Сообщений: 249
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
58 / 58 / 0
Регистрация: 29.11.2011
Сообщений: 272
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
Эксперт С++Автор FAQ
 Аватар для Evg
16822 / 5243 / 318
Регистрация: 30.03.2009
Сообщений: 14,121
Записей в блоге: 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
58 / 58 / 0
Регистрация: 29.11.2011
Сообщений: 272
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
Эксперт С++Автор FAQ
 Аватар для Evg
16822 / 5243 / 318
Регистрация: 30.03.2009
Сообщений: 14,121
Записей в блоге: 26
01.07.2013, 15:22     записать по-битого один short int в два char #8
Praktolock, мои посты можешь не читать, тебе это ни к чему. А вот кому-то они могут оказаться полезными
Praktolock
 Аватар для Praktolock
58 / 58 / 0
Регистрация: 29.11.2011
Сообщений: 272
01.07.2013, 15:27     записать по-битого один short int в два char #9
Я просто сказал что думаю, извини если про макрос тебе показалось подколкой, слишком тонкая шутка. А вот по поводу последнего варианта мне действительно интересно мнение эксперта - что насчёт переносимости такого варианта
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16822 / 5243 / 318
Регистрация: 30.03.2009
Сообщений: 14,121
Записей в блоге: 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
58 / 58 / 0
Регистрация: 29.11.2011
Сообщений: 272
01.07.2013, 17:14     записать по-битого один short int в два char #11
но ведь там используются сдвиги, при этом как раз не учитывается в какую сторону надо сдвигать, т.е. с какой стороны находится младший а с какой старший байт, а вмоём последнем варианте только приведения типов, деления и умножения стандартных типов - вроде-бы максимально кросс-платформенно
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16822 / 5243 / 318
Регистрация: 30.03.2009
Сообщений: 14,121
Записей в блоге: 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
Еще ссылки по теме:

Преобразование 2-х char в один short int C++
C++ Как в выделенную память записать поочередно число int, массив char[n], и еще число int
C++ Как записать и прочитать int (4 byte) из char[]

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

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

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