Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> 4х байтное целое число записать в char[4] 
:(
    Опции темы
relok
Дата 28.11.2010, 17:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 13.11.2010

Репутация: нет
Всего: нет



есть большое число (999999999 к примеру)
можно ли его двоичное представление красиво записать в char массив?

то есть к примеру число 4059099376 
(bin=11110001 11110000 11110000 11110000)
записать в char msg[4] ?
msg[0] будет равно соответственно 11110001 
и так далее

информатикой не занимался, => на ум приходит только брать первый байт, переводить в десятичное и его кидать в msg[0], и так далее

Это сообщение отредактировал(а) relok - 28.11.2010, 18:00
PM MAIL   Вверх
WhKitten
Дата 28.11.2010, 18:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 24.11.2010

Репутация: нет
Всего: нет



Если я правильно понял задачу:
Код

bool le() // true if little-endian
{
    int test = 1;
    return *(reinterpret_cast<char *>(&test)) == 1;
}

int main()
{
    unsigned int n = 4059099376U;
    unsigned char s[sizeof(n)];

    unsigned char *p = reinterpret_cast<unsigned char *>(&n);
    if (le())
        for (int i=sizeof(n)-1; i>=0; --i) s[i] = *p++;
    else
        for (int i=0; i<sizeof(n); ++i) s[i] = *p++;
}


Это сообщение отредактировал(а) WhKitten - 28.11.2010, 18:13
PM MAIL   Вверх
relok
Дата 28.11.2010, 18:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 13.11.2010

Репутация: нет
Всего: нет



мне как новичку нифига не понятно)
сделал так:
tmp[32] - массив из нулей и единиц, который нужно разбить на 4 байта
на выходе - ch[4] , 4 числа от 0 до 255

for(i=0;i<4;i++)
    {
        ch[i]=0;
        k=128;
        for(j=0+i*8;j<8+i*8;j++)
        {
            ch[i]+=tmp[j]*k;
            k=k/2;
        }
    }
PM MAIL   Вверх
WhKitten
Дата 28.11.2010, 18:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 24.11.2010

Репутация: нет
Всего: нет



Мой пример запишет в массив s, числа: 241 240 240 240. Собственно 241 и есть 11110001, а 240 есть 11110000.
Функция le, нужна, чтобы убедится, что первыми идут младшие байты числа в памяти.
PM MAIL   Вверх
relok
Дата 28.11.2010, 18:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 13.11.2010

Репутация: нет
Всего: нет



а что значит unsigned char *p = reinterpret_cast<unsigned char *>(&n);?
а именно reinterpret_cast
PM MAIL   Вверх
WhKitten
Дата 28.11.2010, 18:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 24.11.2010

Репутация: нет
Всего: нет



Преобразует один тип указателя к другому без каких либо проверок. Т.е &n это указатель на unsigned int, берём тот же адрес (тот же указатель), но теперь считаем, что он указывает на unsigned char и присваиваем его p. А далее цикл. Если int 32-х битный, sizeof(n) вернёт 4, и мы запишем 4 байта в массив char'ов.
*p++, сначал берёт значение char по указателю, а затем увеличивает его на размер типа, на который указывает указатель, т.е на sizeof(char)==1.

Это сообщение отредактировал(а) WhKitten - 28.11.2010, 18:42
PM MAIL   Вверх
Леопольд
Дата 28.11.2010, 19:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 943
Регистрация: 17.6.2009

Репутация: 3
Всего: 13



Код
#include <iostream>

int main()
{
   union
   {
      unsigned i;
      unsigned char c[sizeof(unsigned)];
   };

   i = 0xFFFFFFFF;
   std::cout << std::hex << (unsigned)c[0] << (unsigned)c[1] << (unsigned)c[2] << (unsigned)c[3] << std::endl;

   return 0;
}
http://codepad.org/j0x3N8RX


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
WhKitten
Дата 28.11.2010, 19:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 24.11.2010

Репутация: нет
Всего: нет



Цитата(Леопольд @  28.11.2010,  19:28 Найти цитируемый пост)
http://codepad.org/j0x3N8RX

В Windows для i = 0x1FFFFFFF программа выдаст FFFFFF1F, а на MacOS может выдать 1FFFFFFF smile
PM MAIL   Вверх
Леопольд
Дата 28.11.2010, 22:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 943
Регистрация: 17.6.2009

Репутация: 3
Всего: 13



WhKitten, э... и что, сложно сделать std::reverse, или просто пройти в оbратном порядке? Я просто показал что не оbязательно по bайтику каждое число переbирать... А когда у него bудет другой результат на другой платформе, он узнает что есть little endian и big endian.

Это сообщение отредактировал(а) Леопольд - 28.11.2010, 22:10


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
cardinal
Дата 28.11.2010, 22:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

Репутация: нет
Всего: 99



Цитата(relok @  28.11.2010,  15:55 Найти цитируемый пост)
есть большое число (999999999 к примеру)
можно ли его двоичное представление красиво записать в char массив?

Ниодного "красиво" я пока в теме не увидел, а точнее просто ужаснулся что тут увидел...
Цитата(relok @  28.11.2010,  15:55 Найти цитируемый пост)
то есть к примеру число 4059099376 
(bin=11110001 11110000 11110000 11110000)
записать в char msg[4] ?



Вот псевдокод (допишите сам):
Код

i = 4059099376;
msg[3] = i & 0x000000FF;
msg[2] = (i & 0x0000FF00) >> 8;
msg[1] = (i & 0x00FF0000) >> 16;
msg[0] = (i & 0xFF000000) >> 24;



--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
cardinal
Дата 28.11.2010, 22:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

Репутация: нет
Всего: 99



Или вот
http://codepad.org/NTiARQaR

(раз уж Леопольд такой интересный ресурс показал)


--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
Леопольд
Дата 28.11.2010, 22:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 943
Регистрация: 17.6.2009

Репутация: 3
Всего: 13



cardinal, это слишком переносимый вариант. Теперь человек не почувствует "на сеbе" разницу в порядке bайт. smile


Это сообщение отредактировал(а) Леопольд - 28.11.2010, 22:54


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
sQu1rr
Дата 28.11.2010, 23:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 597
Регистрация: 11.11.2008
Где: london

Репутация: 3
Всего: 13



Цитата(Леопольд @  28.11.2010,  22:48 Найти цитируемый пост)
cardinal, это слишком переносимый вариант.

Неужели так плохо?  smile 
PM MAIL Skype GTalk   Вверх
mrbrooks
Дата 29.11.2010, 09:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 19
Всего: 306



а как же memcpy?

Код

int val = 1024;
const unsigned char size = sizeof(int);
unsigned char buf[size];
memcpy(buf, &val, size);


Добавлено через 4 минуты и 27 секунд
ха. кстати пришла такая мысля:

Код

template<typename T>
union Fuck
{
   T value;
   unsigned char buf[sizeof(T)];
}


Добавлено через 5 минут и 30 секунд
хотя Леопольд был раньше. лол.
PM MAIL   Вверх
baldina
Дата 29.11.2010, 10:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 15
Всего: 101



Цитата(mrbrooks @  29.11.2010,  09:48 Найти цитируемый пост)
а как же memcpy?

а как же operator=() ?

Код

int val;
unsigned char s[sizeof(val)];
*(int*)s = val;

PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0885 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.