Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 | 2 |

 

  Вопрос: Проблемы с кодировкой Добавлено: 07.10.06 20:55  

Автор вопроса:  -АлександР- | Web-сайт: sham.clan.su
Привет всем!

Было дело, я спрашивал как сохранить файл под своим собственным расшипением.

Мне для моей программы нужно сохранять только цифры. Одно число – десятеричная система – может содержать одно из десяти значений.
 Но я хочу обхитрить систему.
Чтобы в файл записывать меньше и чтобы он меньше весил. Но считывать можно было – так же (короче без потери данных). (Например, можно записывать и читать с помщью шестнадцтеричной кодировки. – простой пример) Но 16 – тоже мало. Как можно это увеличить на порядок?

Насколько я знаю VB кроме 8, 10 и 16 – ничего не поддерживает, поэтому я решил исправть это дело с помощью кодировки ANSII: записываю в файл символ, а читаю – число с одного символа(!). Получается чуть ли не аналог – 256-ричной системы!!!

Увы, это только в теории всё так гладко оказалось. Многие символы блокнот не в состоянии восприять, напрмер chr(0), chr(1) … , там где русские/ англ б – всё ок.
Такая вот история, не короткая.

Вопрос, почему не сохраняются chr(0) …?
Заранее благодарю,

Ответить

  Ответы Всего ответов: 24  

Номер ответа: 1
Автор ответа:
 Neco



ICQ: 247906854 

Вопросов: 133
Ответов: 882
 Web-сайт: neco.pisem.net
 Профиль | | #1
Добавлено: 08.10.06 02:55
почему в блокноте не сохраняются нули?
ну не знаю - у мелкомягких спроси. :)

я так понял тебе надо открывать файл бинарно и таким образом писать или читать. Потом используешь Put и все 32-хбитные значения будут занимать ровно четыре байта (не знаю про какую среду ты говоришь, поэтому не конкретизирую типы данных).

А в дальнейшем юзай hex-редакторы, когда работаешь не с текстом.

записываю в файл символ, а читаю – число с одного символа

и это число от 0 до 255. А в чём сол?

Ответить

Номер ответа: 2
Автор ответа:
 -АлександР-



Вопросов: 55
Ответов: 1008
 Web-сайт: sham.clan.su
 Профиль | | #2
Добавлено: 08.10.06 11:34
почему в блокноте не сохраняются нули?
В блокноте сохраняются нули chr(48). А вот спец. NOP (chr(0)) и ему подобные - не хотят сохраняться и передаваться в блокноте, textboxe и т п.
бинарно
Последовательно... Хотя это роли не ирает

Да, мне надо открыть файл, записать а потом прочесть chr(0) - например.

Потом используешь Put и все 32-хбитные значения будут занимать ровно четыре байта (не знаю про какую среду ты говоришь, поэтому не конкретизирую типы данных).
Среда "мама не горюй" - VB6, хотя впрочем в C++ Builder - то же самое...

Потом используешь Put и все 32-хбитные значения будут занимать ровно четыре байта
Эта фпаза мне не понятна

А в дальнейшем юзай hex-редакторы, когда работаешь не с текстом.
Спасибо за совет, я к нему прислушаюсь - для того чтобы оперировать в коде. Но это, как я писал, не решение моей проблемы:

Насколько я знаю VB кроме 8, 10 и 16 – ничего не поддерживает, поэтому я решил исправть это дело с помощью кодировки ANSII: записываю в файл символ, а читаю – число с одного символа(!). Получается чуть ли не аналог – 256-ричной системы!!!


и это число от 0 до 255. А в чём сол?
Да в том и соль, чтобы я передал в файл один символ, который будет содержать в себе 255-ричное число. Ты же сам работаешь с hex, а это будет hex^2. Понимаешь смысл?
В том чтобы размер файла экономить - я его хочу закодировать.

Ответить

Номер ответа: 3
Автор ответа:
 BUG(O)R



ICQ: 827887 

Вопросов: 13
Ответов: 142
 Web-сайт: hunger.ru
 Профиль | | #3
Добавлено: 08.10.06 13:17
А вот спец. NOP (chr(0)) и ему подобные - не хотят сохраняться и передаваться в блокноте, textboxe и т п.


Ну наверное потому что символы чей код <= 31 являются непечатаемыми.

Если вопрос стоит в том, чтобы сжать данные для экономии места, то я не понимаю к чему изобретать велосипед, всё равно нового алгоритма не придумаешь, используй уже существующие(тот же хаффман есть, реализованный в виде класса для VB, подключай и сжимай)

Ответить

Номер ответа: 4
Автор ответа:
 -АлександР-



Вопросов: 55
Ответов: 1008
 Web-сайт: sham.clan.su
 Профиль | | #4
Добавлено: 08.10.06 16:53
Ну наверное потому что символы чей код <= 31 являются непечатаемыми.
Кстати, а можно как-нибудь заставить печататься непечатаемые символы?

ЗЫ. По крайней мере в стринговой переменной - они хранятся. И исчезают - сразу при выводе в текстбокс(?)

Ответить

Номер ответа: 5
Автор ответа:
 -АлександР-



Вопросов: 55
Ответов: 1008
 Web-сайт: sham.clan.su
 Профиль | | #5
Добавлено: 08.10.06 16:54
я не понимаю к чему изобретать велосипед, всё равно нового алгоритма не придумаешь
Форду тоже говорили:
- Не изобреай велосипед заново, Генри!
А он взял изобрел автомобиль...


тот же хаффман есть, реализованный в виде класса для VB, подключай и сжимай
А ссылочку или ключевое слово для поиска не дашь?

Ответить

Номер ответа: 6
Автор ответа:
 BUG(O)R



ICQ: 827887 

Вопросов: 13
Ответов: 142
 Web-сайт: hunger.ru
 Профиль | | #6
Добавлено: 08.10.06 17:38
Кстати, а можно как-нибудь заставить печататься непечатаемые символы?

ЗЫ. По крайней мере в стринговой переменной - они хранятся. И исчезают - сразу при выводе в текстбокс(?)


В VB и в прицнипе в любом гуевом приложении в винде стандартные компоненты по умолчанию выводить тебе эти символы на экран не будут, просто потому что не имеют графического представления этих кодов, разве что если используется какой-то нестандартный шрифт или кодировка. Но среди этих символов есть символы форматирования текста, например chr(9) - это tab, а сочетание chr(13) & chr(10) является переносом строки.

Форду тоже говорили:
- Не изобреай велосипед заново, Генри!
А он взял изобрел автомобиль...


Ну если ты уверен, что стоишь на грани открытия и сможешь переплюнуть существующие алгоритмы сжатия данных, то надо было сразу предупреждать о своих наполеоновских планах :)

А ссылочку или ключевое слово для поиска не дашь?


http://www.vb.kiev.ua/code/compress/


Ответить

Номер ответа: 7
Автор ответа:
 -АлександР-



Вопросов: 55
Ответов: 1008
 Web-сайт: sham.clan.su
 Профиль | | #7
Добавлено: 08.10.06 18:07
В VB и в прицнипе в любом гуевом приложении в винде стандартные компоненты по умолчанию выводить тебе эти символы на экран не будут, просто потому что не имеют графического представления этих кодов, разве что если используется какой-то нестандартный шрифт или кодировка. Но среди этих символов есть символы форматирования текста, например chr(9) - это tab, а сочетание chr(13) & chr(10) является переносом строки.
А можно хранить сhr(0)... - не в блокноте. А где-нибудь в стринговой переменной, а потом читать их?

Ответить

Номер ответа: 8
Автор ответа:
 Neco



ICQ: 247906854 

Вопросов: 133
Ответов: 882
 Web-сайт: neco.pisem.net
 Профиль | | #8
Добавлено: 08.10.06 22:18
Что всё таки означает "хранить в блокноте", а?

Option Explicit

Private Sub Form_Load()
    Dim i As Integer
    Dim fNum As Integer
    fNum = FreeFile
    Open "c:\binary" For Binary Access Write As #fNum
    For i = 0 To 10
        Put #fNum, , i
    Next i
    Close #fNum
    
    Dim numm As Integer
    Open "c:\binary" For Binary Access Read As #fNum
        Do While Not EOF(fNum)
            Get #fNum, , numm
            Debug.Print numm
        Loop
    Close #fNum
End Sub

Ответить

Номер ответа: 9
Автор ответа:
 Nj



ICQ: 223663115 

Вопросов: 21
Ответов: 285
 Профиль | | #9 Добавлено: 09.10.06 00:44
Так, значит ты, друг мой, взялся идти по тому черному пути, на котором я основательно застрял: "Сделать свой формат графики, сжать свой формат графики". Бьюсь уже полгода. Фигня - ЖПЕг или ГИФ не переплюнуть. Хотя хочется :))

Отображение управляющих символов зависит от ОС и их позиции относительно друг-друга. Я этим делом очень любил загоняться - есть у меня символ-вьювер собственной разработки. Побаловавшись с ним, можно понять, что и как отображается (точнее постараться), если хочешь - могу скинуть на мыло. Там же и реализованы механизмы перевода систем счисления.

АСКИ-код и есть 256-ричная система в каком-то смысле. Но вот 0 в ней нет для бэйсика! 0 - отсутствие символа по его мнению, его можно записать, но нельзя прочитать. Остальные 255 - можно записать и прочитать - даже если блокнот не покажет. Правда некоторые комбинации могут привести к тому, как мне показалось, что бэйсик начинает неадекватно читать символы такого файла, если баловаться с символом типа ЕОФ и т.п.

Вот проверь код - он покажет байтовый размер файла - там будут чар(0). Но вот функция Input() и операторы типа Line Input не читают нулевые...
Private Sub Form_Load()

Dim x As String
x = Chr(0) & Chr(0) & Chr(1)

MsgBox Len(x)

Open "C:\cool.txt" For Output As 1
Print #1, x
Close


MsgBox FileLen("C:\cool.txt";)

End Sub

Насчет сжатия - попробуй поработать на битовом уровне - переводи байты (0-256) в биты (00000000-11111111) и шифруй там. Мне ничего пока не дало. Можно сделать 255-ричную систему счисления, и записывать 0 как 1, а 255 символ уже как 2 символа. Если надо - могу прислать бэйсиковский перевод универсальной формулы конвертации систем счисления. Но её придется отлаживать вручную - искать пределы допустимых значений.
ИМХО - все что я тут сказал. Основано на личных наблюдениях - кто поправит - окажет мне услугу.

Ответить

Номер ответа: 10
Автор ответа:
 Nj



ICQ: 223663115 

Вопросов: 21
Ответов: 285
 Профиль | | #10 Добавлено: 09.10.06 01:10
Я тут кодом Neco решил позаписывать chr(0)...
зависает - ЕОФ(0) всегда лож дает и все...
тожн эффект от Do While Not. В чем проблема-то у меня?
Private Sub Form_Load()
    Dim i As Integer
    Dim fNum As Integer
    fNum = FreeFile
    Open "c:\binary" For Binary Access Write As #fNum
    For i = 0 To 10
        Put #fNum, , Chr(i) ' Сэйвим не цифру, а символ с кодом i
    Next i
    Close #fNum
     
MsgBox FileLen("c:\binary";) ' откуда тут 55? Бэйсик своего напихал...
'Поэтому я с бинари и рандомом не связываюсь... должно то быть 10!
     
    Dim numm As String, St As String, Z
    Open "c:\binary" For Binary Access Read As #fNum
        Do Until EOF(fNum) 'Читаем, пока есть что читать, не так ли?
         Z = Z + 1 'это просто так, чтобы выводы делать
           Get #fNum, , numm
           St = St & numm
        Loop
    Close #fNum
    
    MsgBox Len(St)
    MsgBox St
    
    Kill "c:\binary"
    
End Sub

Ответить

Номер ответа: 11
Автор ответа:
 Neco



ICQ: 247906854 

Вопросов: 133
Ответов: 882
 Web-сайт: neco.pisem.net
 Профиль | | #11
Добавлено: 09.10.06 20:12
1. функция chr() наверняка возвращает variant - отсюда 55 байт вместо 11 (почему 10-то?) сделай Cstr(chr(i)) - должно заработать так как ожидается.
2. когда делаешь get - позаботься о том, чтобы размер буфера был больше чем 0 - почему у тебя numm не инициализируется?
3. сжатие лучше чем jpeg? - когда я искал алгоритмы сжатия звука, я постоянно наталкивался на сжатие графики - и мне попадался архиватор png (специализированный) сжимающий лучше rar'а. Так что не исключайте возможность написать что-то получше - надо только учесть, что преимущества jpeg&giff в их известности, а не "лучшесжимательности" - вместе с acdsee идёт формат jpeg2000, сжимает лучше, но кто о нём знает?

Товарищи, это просто неприлично - когда у вас есть рабочий код, надо просто пройтись по нему F8 и продумать каждый шаг.

Ответить

Номер ответа: 12
Автор ответа:
 Neco



ICQ: 247906854 

Вопросов: 133
Ответов: 882
 Web-сайт: neco.pisem.net
 Профиль | | #12
Добавлено: 09.10.06 20:14
Форду тоже говорили:
- Не изобреай велосипед заново, Генри!
А он взял изобрел автомобиль...

А я думал, что Форд изобрёл конвейер, а он во какой крутой дядька оказывается.

Ответить

Номер ответа: 13
Автор ответа:
 Nj



ICQ: 223663115 

Вопросов: 21
Ответов: 285
 Профиль | | #13 Добавлено: 09.10.06 21:21
2 Neco
1.
почему у тебя numm не инициализируется?
А у тебя он где инится - я же твой код модифицировал...
2. Я в этом деле не силен, но о каком буфере речь - я с операторами Гет и Пут работал последний раз в QB, там буферов не было.
А я думал, что Форд изобрёл конвейер, а он во какой крутой дядька оказывается.
Не крутой дядька - Рокфеллер, он первым догадался применять автоматы для разгона демонстраций :)
Товарищи, это просто неприлично - когда у вас есть рабочий код, надо просто пройтись по нему F8 и продумать каждый шаг.
Дык если бы я понял, почему оператор ЕОФ(фнум) всегда возвращает ЛОЖЬ в этом месте? Ошибка-то скрытая, прога зависает - гетит бесконечно записи....
3. Ну ГИФ(на основе старого ЛЗВ) и ЖПЕГ - это наилучшие способы сжатия графики - ПНГ не сжимает графу лучще, он просто меньше портит картинку - эти двое ее долбят. Эти форматы не просто так входят в международную официальную спецификацию... - они лучшие. Остальные либо ожидаю спецификации, либо не подходят. Но ты абсолютно прав
не исключайте возможность написать что-то получше
- стараюсь, пока научился только раздувать файлы :)) а не сжимать... поживем - увидим.

Ответить

Номер ответа: 14
Автор ответа:
 Neco



ICQ: 247906854 

Вопросов: 133
Ответов: 882
 Web-сайт: neco.pisem.net
 Профиль | | #14
Добавлено: 09.10.06 22:01
А у тебя он где инится - я же твой код модифицировал...

у меня это не string, а integer - он сразу четы.., пардон, два байта весит - ValueType.
Ошибка-то скрытая, прога зависает - гетит бесконечно записи....

ничего скрытого - видно же, что в твой numm ничего не попадает, значит файл не читается - а сколько надо циклов в которых читается 0 байт, чтобы прочитать файл размером в один байт?

Парни, а почему вы так озаботились тем, чтобы числа хранить в строках? зачем numm делать строкой?

Если хотите с наименьшими потерями сохранять числа в диапазоне от 0 до 10, то надо просто посчитать сколько для это требуется бит. Минимально 4 бита (16 значений), а у нас минимальный тип данных Byte (8 бит) значит туда можно запихнуть два наших значения - к первому прибавляем второе умноженное на 16 (сдвигаем на четыре бита) и получаем два наших числа в одном байте. Этот байт пихаем в файл Put #fNum,,our_byte (as byte, а не as variant) и получаем файл размером в байт, в котором хранятся два числа.

Ответить

Номер ответа: 15
Автор ответа:
 -АлександР-



Вопросов: 55
Ответов: 1008
 Web-сайт: sham.clan.su
 Профиль | | #15
Добавлено: 09.10.06 22:28
Neco
Что всё таки означает "хранить в блокноте", а?
Типа того...
Option Explicit
Dim F As Byte
Dim MyText As String

Private Sub Command1_Click()

    F = FreeFile
    Open App.Path & "\Save.txt" For Output As #F
        Print #F, Text1.Text
    Close #F
    
End Sub

Private Sub Command2_Click()

    F = FreeFile
    Open App.Path & "\Save.txt" For Input As #F
    Do Until EOF(F)
        Line Input #F, MyText
        Text1.Text = MyText
    Loop
    Close #F

End Sub

Private Sub Form_Load()

    Text1.Text = ""

End Sub


Nj
Вот проверь код - он покажет байтовый размер файла - там будут чар(0). Но вот функция Input() и операторы типа Line Input не читают нулевые...
Да, заметил. В блокноте - он как просто пробел. Но обратно не читается.
Отображение управляющих символов зависит от ОС и их позиции относительно друг-друга. Я этим делом очень любил загоняться - есть у меня символ-вьювер собственной разработки. Побаловавшись с ним, можно понять, что и как отображается (точнее постараться), если хочешь - могу скинуть на мыло. Там же и реализованы механизмы перевода систем счисления.
Скинь на e-mail - интересно посмотреть... мне что-то такое на приходило в голову, но что-то потом ушла мысль...

Ответить

Страница: 1 | 2 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам