Автор вопроса: -АлександР- | Web-сайт:sham.clan.su
Привет всем!
Было дело, я спрашивал как сохранить файл под своим собственным расшипением.
Мне для моей программы нужно сохранять только цифры. Одно число – десятеричная система – может содержать одно из десяти значений.
Но я хочу обхитрить систему.
Чтобы в файл записывать меньше и чтобы он меньше весил. Но считывать можно было – так же (короче без потери данных). (Например, можно записывать и читать с помщью шестнадцтеричной кодировки. – простой пример) Но 16 – тоже мало. Как можно это увеличить на порядок?
Насколько я знаю VB кроме 8, 10 и 16 – ничего не поддерживает, поэтому я решил исправть это дело с помощью кодировки ANSII: записываю в файл символ, а читаю – число с одного символа(!). Получается чуть ли не аналог – 256-ричной системы!!!
Увы, это только в теории всё так гладко оказалось. Многие символы блокнот не в состоянии восприять, напрмер chr(0), chr(1) … , там где русские/ англ б – всё ок.
Такая вот история, не короткая.
Вопрос, почему не сохраняются chr(0) …?
Заранее благодарю,
почему в блокноте не сохраняются нули?
ну не знаю - у мелкомягких спроси.
я так понял тебе надо открывать файл бинарно и таким образом писать или читать. Потом используешь Put и все 32-хбитные значения будут занимать ровно четыре байта (не знаю про какую среду ты говоришь, поэтому не конкретизирую типы данных).
А в дальнейшем юзай hex-редакторы, когда работаешь не с текстом.
записываю в файл символ, а читаю – число с одного символа
В блокноте сохраняются нули 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. Понимаешь смысл?
В том чтобы размер файла экономить - я его хочу закодировать.
А вот спец. NOP (chr(0)) и ему подобные - не хотят сохраняться и передаваться в блокноте, textboxe и т п.
Ну наверное потому что символы чей код <= 31 являются непечатаемыми.
Если вопрос стоит в том, чтобы сжать данные для экономии места, то я не понимаю к чему изобретать велосипед, всё равно нового алгоритма не придумаешь, используй уже существующие(тот же хаффман есть, реализованный в виде класса для VB, подключай и сжимай)
Кстати, а можно как-нибудь заставить печататься непечатаемые символы?
ЗЫ. По крайней мере в стринговой переменной - они хранятся. И исчезают - сразу при выводе в текстбокс(?)
В VB и в прицнипе в любом гуевом приложении в винде стандартные компоненты по умолчанию выводить тебе эти символы на экран не будут, просто потому что не имеют графического представления этих кодов, разве что если используется какой-то нестандартный шрифт или кодировка. Но среди этих символов есть символы форматирования текста, например chr(9) - это tab, а сочетание chr(13) & chr(10) является переносом строки.
Форду тоже говорили:
- Не изобреай велосипед заново, Генри!
А он взял изобрел автомобиль...
Ну если ты уверен, что стоишь на грани открытия и сможешь переплюнуть существующие алгоритмы сжатия данных, то надо было сразу предупреждать о своих наполеоновских планах
В VB и в прицнипе в любом гуевом приложении в винде стандартные компоненты по умолчанию выводить тебе эти символы на экран не будут, просто потому что не имеют графического представления этих кодов, разве что если используется какой-то нестандартный шрифт или кодировка. Но среди этих символов есть символы форматирования текста, например chr(9) - это tab, а сочетание chr(13) & chr(10) является переносом строки.
А можно хранить сhr(0)... - не в блокноте. А где-нибудь в стринговой переменной, а потом читать их?
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
Так, значит ты, друг мой, взялся идти по тому черному пути, на котором я основательно застрял: "Сделать свой формат графики, сжать свой формат графики". Бьюсь уже полгода. Фигня - ЖПЕг или ГИФ не переплюнуть. Хотя хочется )
Отображение управляющих символов зависит от ОС и их позиции относительно друг-друга. Я этим делом очень любил загоняться - есть у меня символ-вьювер собственной разработки. Побаловавшись с ним, можно понять, что и как отображается (точнее постараться), если хочешь - могу скинуть на мыло. Там же и реализованы механизмы перевода систем счисления.
АСКИ-код и есть 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 символа. Если надо - могу прислать бэйсиковский перевод универсальной формулы конвертации систем счисления. Но её придется отлаживать вручную - искать пределы допустимых значений.
ИМХО - все что я тут сказал. Основано на личных наблюдениях - кто поправит - окажет мне услугу.
Я тут кодом 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
1. функция chr() наверняка возвращает variant - отсюда 55 байт вместо 11 (почему 10-то?) сделай Cstr(chr(i)) - должно заработать так как ожидается.
2. когда делаешь get - позаботься о том, чтобы размер буфера был больше чем 0 - почему у тебя numm не инициализируется?
3. сжатие лучше чем jpeg? - когда я искал алгоритмы сжатия звука, я постоянно наталкивался на сжатие графики - и мне попадался архиватор png (специализированный) сжимающий лучше rar'а. Так что не исключайте возможность написать что-то получше - надо только учесть, что преимущества jpeg&giff в их известности, а не "лучшесжимательности" - вместе с acdsee идёт формат jpeg2000, сжимает лучше, но кто о нём знает?
Товарищи, это просто неприлично - когда у вас есть рабочий код, надо просто пройтись по нему F8 и продумать каждый шаг.
А у тебя он где инится - я же твой код модифицировал...
2. Я в этом деле не силен, но о каком буфере речь - я с операторами Гет и Пут работал последний раз в QB, там буферов не было.
А я думал, что Форд изобрёл конвейер, а он во какой крутой дядька оказывается.
Не крутой дядька - Рокфеллер, он первым догадался применять автоматы для разгона демонстраций
Товарищи, это просто неприлично - когда у вас есть рабочий код, надо просто пройтись по нему F8 и продумать каждый шаг.
Дык если бы я понял, почему оператор ЕОФ(фнум) всегда возвращает ЛОЖЬ в этом месте? Ошибка-то скрытая, прога зависает - гетит бесконечно записи....
3. Ну ГИФ(на основе старого ЛЗВ) и ЖПЕГ - это наилучшие способы сжатия графики - ПНГ не сжимает графу лучще, он просто меньше портит картинку - эти двое ее долбят. Эти форматы не просто так входят в международную официальную спецификацию... - они лучшие. Остальные либо ожидаю спецификации, либо не подходят. Но ты абсолютно прав
не исключайте возможность написать что-то получше
- стараюсь, пока научился только раздувать файлы ) а не сжимать... поживем - увидим.
ничего скрытого - видно же, что в твой numm ничего не попадает, значит файл не читается - а сколько надо циклов в которых читается 0 байт, чтобы прочитать файл размером в один байт?
Парни, а почему вы так озаботились тем, чтобы числа хранить в строках? зачем numm делать строкой?
Если хотите с наименьшими потерями сохранять числа в диапазоне от 0 до 10, то надо просто посчитать сколько для это требуется бит. Минимально 4 бита (16 значений), а у нас минимальный тип данных Byte (8 бит) значит туда можно запихнуть два наших значения - к первому прибавляем второе умноженное на 16 (сдвигаем на четыре бита) и получаем два наших числа в одном байте. Этот байт пихаем в файл Put #fNum,,our_byte (as byte, а не as variant) и получаем файл размером в байт, в котором хранятся два числа.
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 - интересно посмотреть... мне что-то такое на приходило в голову, но что-то потом ушла мысль...