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

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

Алгоритмы LZW, LZ77 и LZ78 : http://habrahabr.ru/post/132683/
...
Рейтинг: 0 / 0
29.09.2012, 04:19
    #37976786
ZVI
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
29.09.2012, 04:45
    #37976788
ZVI
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
29.09.2012, 09:07
    #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
29.09.2012, 11:28
    #37976859
ZVI
ZVI
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сжатие текстовой строки.
КазанскийПривет, Владимир!
А разве StrConv не делает то же самое?
Привет, Алексей!
Ночью не делал :-)
Шучу, конечно, со StrConv и короче, и быстрее
...
Рейтинг: 0 / 0
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Сжатие текстовой строки. / 17 сообщений из 17, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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