FreeBasic
Главная
Вход
Регистрация
Воскресенье, 22.12.2024, 05:15Приветствую Вас Гость | RSS
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Сжатие строки
WQДата: Понедельник, 17.10.2016, 15:42 | Сообщение # 1
Полковник
Группа: Проверенные
Сообщений: 215
Репутация: 7
Статус: Offline
Есть строка достаточно большого размера, она передается по сети.
Для ускорения передачи хотелось бы ее сжать, если подобные алгоритмы на FB?
 
haavДата: Вторник, 18.10.2016, 13:43 | Сообщение # 2
Генералиссимус
Группа: Администраторы
Сообщений: 1373
Репутация: 50
Статус: Offline
Не припомню реализованные на FB алгоритмы сжатия. Никто этим не заморачивается, когда есть готовые и удобные библиотеки (libzip, zlib, 7-zip и пр.)

Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
WQДата: Вторник, 18.10.2016, 20:38 | Сообщение # 3
Полковник
Группа: Проверенные
Сообщений: 215
Репутация: 7
Статус: Offline
Я нашел несколько примеров на оф форуме, но понимаю, что к моей задаче все это тупиковый путь
 
VitaminДата: Четверг, 08.12.2016, 22:11 | Сообщение # 4
Лейтенант
Группа: Пользователи
Сообщений: 59
Репутация: 4
Статус: Offline
Есть у меня небольшой алгоритм сжатия на FreeBasic. Основан на LZ77 с окном 64КБ, байт ориентированный. Сжимает строку или участок памяти.
Исходный код лежит здесь:  https://yadi.sk/d/qwM77O-h3KRoqY

Пример сжатия строки:
Код
#Include "lzg.bas"

Dim As String mas2,mas="abracadabra abracadabra abracadabra abracadabra"

?:?" UPAKOVKA = ";
mas2=LzgCompress(mas):?"OK"

?" RASPAKOVKA = ";
Var mas3=LzgDecompress(mas2):?"OK"
?:? " razmer_ishodn = ";Len(mas)
?" razmer_upak = ";Len(mas2)

?:?" SRAVNENIE=";
If mas=mas3 Then ?"DA" Else ?"NET"

Sleep

Пример сжатия файла (памяти):

Код
#Include "file.bi"
#Include "lzg.bas" ' Сжатие Участка Памяти

Var file = "file.txt"
var ff = FreeFile
Dim As ULong i, razmer, razm, razmer2
Dim As UByte Ptr mas,ms,mas2

If FileExists(file) = 0 Then ?"No File for Compress!":Sleep:End
Open file For Binary Access Read As ff
razmer = Lof(ff)
If razmer Then
   mas = Allocate(razmer)
   Get #ff,,*mas,razmer
Else
   ?"No Data for Compress!":Sleep:End
EndIf
Close ff

Var tm = Timer
?:?" Upakovka = "; ' упаковка
razm = LzgCompress(mas,razmer,ms):?Using "##.### sek";(Timer-tm):tm = Timer

?" Raspakovka = "; ' распаковка
razmer2 = LzgDecompress(ms, razm, mas2):?Using "##.### sek";(Timer-tm)
?:? " Razmer Ishodn = ";razmer
?" Razmer Upak = ";razm

?:?" SRAVNENIE = "; ' сравниваем распакованный и исходный массивы
If razmer = razmer2 Then
   For i = 0 To razmer-1
      If mas [i]<> mas2 [i]Then Exit For
   Next
EndIf
If i = razmer Then ?"DA" Else ?"NET"

ff = FreeFile
Open file & ".lzg" For Binary Access write Lock write As ff
Put #ff,,*ms,razm ' записываем упакованный массив в файл
Close ff

DeAllocate mas ' удаляем исходный массив
DeAllocate ms ' удаляем сжатые данные
DeAllocate mas2 ' удаляем распакованный массив

Sleep


Сообщение отредактировал Vitamin - Воскресенье, 25.06.2017, 12:09
 
haavДата: Вторник, 06.06.2017, 11:40 | Сообщение # 5
Генералиссимус
Группа: Администраторы
Сообщений: 1373
Репутация: 50
Статус: Offline
Цитата Vitamin ()
Есть у меня небольшой алгоритм сжатия на FreeBasic. Основан на LZ77 с окном 64КБ, байт ориентированный. Сжимает строку или участок памяти.

Полезный код, спасибо.


Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
  • Страница 1 из 1
  • 1
Поиск: