Сайт | Лаборатория | Форум | Wikiservia



In english

harpywar.com

Главная

Вики

Форум

Лаборатория

 Статьи
   Игры
   Настройка серверов
     PvPGN
     D2GS
     NFS: U
     Apache
     ArcEmu

   Кодинг
     .NET
     PHP

   Разное

 Проекты
   QDoom
   IRC Search
   vbreality [web]
   UTech p2p Realm [web]
   PvPGN система статистики
   Diablo 2 Launcher
   WoW Simple Launcher

 Моё
   Творчество
   Оборудование

Поиск по сайту


Хостинг и VDS, скидка при переходе
 
Crontab - циклический запуск скриптов
Мониторинг игровых серверов через QStat
Вариант установки ОС Windows без CD-ROM
Консольное подключение к Remote Desktop в Windows
Альтернативное «ку»
Как открыть гигабайтный лог
Простое «сжатие» числа
Простое «сжатие» числаСоздано: 03.10.2009
Изменено: 03.10.2009
Автор: HarpyWar

Идея такая.
Любое число можно запаковать в байты, получив размер в 1,5-2,5 раза меньше, следующим алгоритмом:
    1. Берем три цифры от текущей позиции.
    2. Если получившееся число больше 255, то смещаем позицию на минус 1, и получаем двузначное число, которое помещаем в байт.
    3. Если получившееся число меньше 256, помещаем его в байт
    4. Если цифра равна 0, помещаем этот 0 в отдельный байт.


Пример
    Число 1257075081

    1. Первое трехзначное число (125) меньше 256, помещаем его в первый байт.
    2. Следующее трехзначное число (707) больше 255, поэтому в следующий байт помещаем 70
    3. Следующее трехзначное число (750) больше 255, поэтому в следующий байт помещаем 75
    4. Следующая цифра 0, поэтому помещаем его в отдельный байт
    5. Оставшееся число 81, кладем его в последний байт.

    Итого, получили 5 байтов, вместо 10:
     byte array
     (
      0 => 125,
      1 => 70,
      2 => 75,
      3 => 0,
      4 => 81
     )


Распаковка
    Простым объединением получившегося массива в строку.


Где использовать
    Шифрование и сжатие данных.

 xpeh
07 Октябрь 2009, 19:32 | #233 
ЩИТО?

Юнипс таймстемп 4 байта, а у тебя 5, где экономия? :D

 HarpyWar
08 Октябрь 2009, 12:57 | #234 
Ну это я просто в качестве примера числа.
Хотя, наверное, даже обычный pack() получше числа пакует чем этот способ...

 a
10 Октябрь 2009, 01:25 | #235 
вредное последствие увлечения текстово-ориентированными языками типа пхп
хранение числа в двоичном формате естественно короче чем в текстовом, но оно уже есть и было с самого начала возникновения компов естественным образом

 CAPTAIN
30 Январь 2010, 02:35 | #248 
Это если числа представлены в тексте, если числа представлены как числа экономии таким образом не добиться. Думаю мало народу хранят цифры в строковых переменных.
А идея красивая)

 basman
26 Декабрь 2013, 20:35 | #362 
qwe

 basman
26 Декабрь 2013, 20:37 | #363 
$uint32_bytes = pack("L", 1257075081 );
$uint32 = unpack("L", $uint32_bytes)[1];

зачем 5 байт ?

 basman
26 Декабрь 2013, 20:37 | #364 
auto packetData = packet_get_raw_data_const(packet, 0);
int offset = 3;

auto userId = (uint32_t)( (unsigned char)packet->u.data[offset+3] << 24 | (unsigned char)packet->u.data[offset+2] << 16 | (unsigned char)packet->u.data[offset+1] << 8 | (unsigned char)packet->u.data[offset] );

 basman
26 Декабрь 2013, 20:38 | #365 
кстати коментарий не добавляется с одинарной кавычкой


Есть вопросы по настройке игровых серверов? Добро пожаловать на форум!

Имя: Проверка: = 1154


© 2006—2017, HarpyWar

Любое копирование информации с этого сайта - только со ссылкой на источник.
Это в одинаковой мере распространяется на любую авторскую информацию в интернете.