powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Сжатие текстовой строки.
17 сообщений из 17, страница 1 из 1
Сжатие текстовой строки.
    #37974328
Minch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет!
Есть задача в которой требуется сжать текстовую строку. А потом из архивной вернуть исходник.
Например существует строка 48 символов:
Tupostr150005/Green+Yellow/XXXL(36/32)/000004567
Из нее надо получить строку в приделах 25 символов.
Например: %:?12?010101 (не важно какую)
А потом из нее вернуть первоначальную.
Это вообще возможно?
...
Рейтинг: 0 / 0
Сжатие текстовой строки.
    #37974340
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В строку из читаемых символов — нет. В бинарник — возможно.
...
Рейтинг: 0 / 0
Сжатие текстовой строки.
    #37974350
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А вообще чем меньше данных тем меньше сжатие, так что шансов ужать 48 байт почти вдвое очень мало.
...
Рейтинг: 0 / 0
Сжатие текстовой строки.
    #37974353
Minch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подскажи каким способом перевести в бинарный?
...
Рейтинг: 0 / 0
Сжатие текстовой строки.
    #37974363
Minch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyА вообще чем меньше данных тем меньше сжатие, так что шансов ужать 48 байт почти вдвое очень мало.
Да, в этом и состоит основная проблема. Что максимальная строка 65 символов.
Есть методы сжатия (например метод Хаффмана), но все они рассчитаны на большое кол-во данных.
...
Рейтинг: 0 / 0
Сжатие текстовой строки.
    #37974378
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MinchНапример существует строка 48 символов:
Tupostr150005/Green+Yellow/XXXL(36/32)/000004567 Например какие строки еще существуют? А может там словарь составить можно, например название цветов, тогда и сильнее можно ужать.

А то приведенный пример можно вообще до одного бита ужать, если всего два варианта существуют )
...
Рейтинг: 0 / 0
Сжатие текстовой строки.
    #37974412
Minch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
К сожалению, строки очень разнообразны, возможно и отсутствие цветов, и сочетание букв ни как не соотносящихся к словами ((
...
Рейтинг: 0 / 0
Сжатие текстовой строки.
    #37974418
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я же не говорил, что словарь должен состоять из осмысленных слов.
Там может быть типа "000000", "XXXL" и т.п.
Надо взять весь массив возможных вариантов и составить словарь, возможно все-таки удастся сильно жать
...
Рейтинг: 0 / 0
Сжатие текстовой строки.
    #37974453
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще немножно поясню - если задача сугубо прикладная - словарь может храниться отдельно (то есть как бы быть включенным в алгоритм сжатия/распаковки, а не в файл данных) и тогда можно добиться действительно хороших показателей.
...
Рейтинг: 0 / 0
Сжатие текстовой строки.
    #37974552
Казанский
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если оставить только ПРОПИСНЫЕ латинские буквы, цифры и знаки препинания, чтобы число различных символов не превышало 64, то на каждый символ потребуется 5 байт. В 25 байтах можно хранить 40 символов, без сложных алгоритмов сжатия.
...
Рейтинг: 0 / 0
Сжатие текстовой строки.
    #37974690
pectopatop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyВ строку из читаемых символов — нет. В бинарник — возможно.
И это неверный ответ, Антоша...
Подумай на что можно заменить строку "АААААААААААААААААААААА", и также подумай над такой штучкой как "Escape character"
...
Рейтинг: 0 / 0
Сжатие текстовой строки.
    #37974859
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подумал.
Разумные мысли высказали Shocker.Pro и Казанский. От твоей веет криптонеадекватом.
...
Рейтинг: 0 / 0
Сжатие текстовой строки.
    #37974865
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ТС, просвещайтесь

Алгоритмы LZW, LZ77 и LZ78 : http://habrahabr.ru/post/132683/
...
Рейтинг: 0 / 0
Сжатие текстовой строки.
    #37976786
ZVI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Раз уж мы на форуме VB, то речь, очевидно, о (VB) Unicode тексте.
Тогда сжатие в 2 раза англоязычного текста в любом регистре с цифрами, скобками и знаками пунктуации, а также восстановление сделать достаточно просто:

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
Sub Test()
  
  Const Txt As String = "Tupostr150005/Green+Yellow/XXXL(36/32)/000004567"
  
  Dim s1 As String, s2 As String
  
  ' Кодировать Txt в s1
  s1 = EnCode(Txt)
  
  ' Проверить количество байт Txt и s1
  Debug.Print "EnCode:", Len(Txt), Len(s1)
  
  ' Декодировать s1 в s2
  s2 = DeCode(s1)
  
  ' Проверить количество байт s1 и s2
  Debug.Print "DeCode:", Len(s1), Len(s2)
  
  ' Сравнить корректность кодека
  Debug.Print "IsTrue:", s2 = Txt
  
End Sub

' Сжатие Unicode текста в 2 раза
Function EnCode(Txt As String) As String
  Dim a() As Byte, b() As Byte, i As Long
  a() = Txt
  ReDim b(0 To (UBound(a) - 1) / 2)
  For i = 0 To UBound(b)
    If a(i * 2 + 1) Then EnCode = Txt: Exit Function
    b(i) = a(i * 2)
  Next
  EnCode = b()
End Function

' Восстановление исходного текста из сжатого
Function DeCode(Txt As String) As String
  Dim a() As Byte, b() As Byte, i As Long
  a() = Txt
  ReDim b(0 To UBound(a) * 2 + 1)
  For i = 0 To UBound(a)
    b(i * 2) = a(i)
  Next
  DeCode = b()
End Function
...
Рейтинг: 0 / 0
Сжатие текстовой строки.
    #37976788
ZVI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Несложно поддержать и русский текст:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
Sub Test()
  
  Const Txt As String = "Русский текст: АБВэюяёЁ; English: Tupostr150005/Green+Yellow/XXXL(36/32)/000004567"
  
  Dim s1 As String, s2 As String
  
  ' Кодировать Txt в s1
  s1 = EnCode(Txt)
  
  ' Проверить количество байт Txt и s1
  Debug.Print "EnCode:", Len(Txt), Len(s1)
  
  ' Декодировать s1 в s2
  s2 = DeCode(s1)
  
  ' Проверить количество байт s1 и s2
  Debug.Print "DeCode:", Len(s1), Len(s2)
  
  ' Сравнить корректность кодека
  Debug.Print "IsTrue:", s2 = Txt
  
End Sub

' Сжатие Unicode текста в 2 раза
Function EnCode(Txt As String) As String
  Dim a() As Byte, b() As Byte, i As Long
  a() = Txt
  ReDim b(0 To (UBound(a) - 1) / 2)
  For i = 0 To UBound(b)
    If a(i * 2 + 1) = 4 Then
      b(i) = a(i * 2) + 174
    Else
      b(i) = a(i * 2)
    End If
  Next
  EnCode = b()
End Function

' Восстановление исходного текста из сжатого
Function DeCode(Txt As String) As String
  Dim a() As Byte, b() As Byte, i As Long
  a() = Txt
  ReDim b(0 To UBound(a) * 2 + 1)
  For i = 0 To UBound(a)
    If a(i) > 174 Then
      b(i * 2) = a(i) - 174
      b(i * 2 + 1) = 4
    Else
      b(i * 2) = a(i)
    End If
  Next
  DeCode = b()
End Function
...
Рейтинг: 0 / 0
Сжатие текстовой строки.
    #37976811
Казанский
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет, Владимир!
А разве StrConv не делает то же самое? Используя твой пример
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
Sub bb()
  Const Txt As String = "Русский текст: АБВэюяёЁ; English: Tupostr150005/Green+Yellow/XXXL(36/32)/000004567"
  Dim s1$, s2$
  ' Кодировать Txt в s1
  s1 = StrConv(Txt, vbFromUnicode)
  
  ' Проверить количество байт Txt и s1
  Debug.Print "EnCode:", Len(Txt), Len(s1)
  
  ' Декодировать s1 в s2
  s2 = StrConv(s1, vbUnicode)
  
  ' Проверить количество байт s1 и s2
  Debug.Print "DeCode:", Len(s1), Len(s2)
  
  ' Сравнить корректность кодека
  Debug.Print "IsTrue:", s2 = Txt


End Sub
...
Рейтинг: 0 / 0
Сжатие текстовой строки.
    #37976859
ZVI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КазанскийПривет, Владимир!
А разве StrConv не делает то же самое?
Привет, Алексей!
Ночью не делал :-)
Шучу, конечно, со StrConv и короче, и быстрее
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Сжатие текстовой строки.
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]