Visual Basic 6.0 - Закодировать текстовый файл
Re: Закодировать текстовый файл
From: Alexander Asyabrik <belmis [@] mail.belpak.by>
Привет, Roman.
Вы, было дело, писали, 11:39 16.05.04:
RY> Кстати, меня тут все пытались уверить, что преобразование массива
RY> байт в строку - раз плюнуть.
говорить о копировании его содержимого) в строку (равно как и
обратное) производится обычной операцией присвоения. Главное условие:
массив не должен быть объявлен с фиксированным размером вроде этого:
Dim bArray(58) As Byte.
Dim bArray() As Byte, strVar As String
strVar = "Any String"
bArray = strVar
strVar = bArray
MsgBox strVar
Массив после присвоения будет иметь размер вдвое больший, чем длина
строки (Len(strVar)). Поэтому следует перед присвоением преобразовать
данные в этой строке из Unicode в ANSI. bArray = StrConv(strVar,
vbUnicode). При обратном присвоении - все проделать наоборот.
Вывод: Если уж не "раз плюнуть", то где-то пару раз :)
--
Alexander
* Origin: Talk.Mail.Ru (2:5020/400)
Re: Закодировать текстовый файл
From: "A. Skrobov" <tyomitch [@] r66.ru>
Hello, Roman!
You wrote in conference fido7.ru.visual.basic to "A.Skrobov"
<fido7.ru.visual.basic [@] talk.ru>to A. Skrobov on Sun, 16 May 2004 12:37:33
+0400:
AS>>>> Давай, пиши замену подстроки в байтовом массиве, посмотрим,
AS>>>> будет ли быстрее. Чyр без CopyMemory.
RY>>> Быстрее чего? Быстрее replace? Или поиска и замены по Mid$? ;)
AS>> ^^^^^^^^^^^^^^^^^^^^^^^^
AS>> Причём без Replace в обоих случаях
RY> Дык visualbasic 5.
RY> Байты быстрее. У меня в Visual Basic 5 своя функция аналог Replace.
RY> Hаписана на строках. Тормозит. Аргумент? ;)
Hапишешь на байтах, чтобы было быстрее - будет аргумент.
With best regards, A. Skrobov. E-mail: tyomitch [@] r66.ru
--
* Origin: Talk.Mail.Ru (2:5020/400)
Re: Кому тут был нужен простой HTTP-сервер, с обработкой GET и POST?
From: "A. Skrobov" <tyomitch [@] r66.ru>
Hello, Anton!
You wrote in conference fido7.ru.visual.basic to "Roman Yuakovlev"
<fido7.ru.visual.basic [@] talk.ru>to Roman Yuakovlev on Wed, 12 May 2004
15:34:57 +0400:
RY>> Уважаемый, тема была начата не сейчас, и цель была совсем не эта.
AL> целью был я надеюсь http-сервер? или заголовок не отражает сути?
==========================================================================
* Newsgroup: fido7.ru.visual.basic
* From: "Roman Yuakovlev" <Roman.Yuakovlev [@] p13.f44.n5045.z2.fidonet.org>
* Date: Thu, 01 Apr 2004 21:57:52 +0400
* To: A. Skrobov
* Subj: обработка метода post - fido7.ru.visual.basic
==========================================================================
RY>> ps. А если как-то для этих целей activex ocx приспособить?
AS> А что, собственно говоря, нужно? Может быть, там без сабжа на самом
AS> деле проще. Обрабатывать введённые формы? Hу так сделай из формы осх и
AS> клади на страницу.
Главное - это выводить результат в браузер, и взаимодействовать с программой
тоже посредством браузера.
AS> А если свой сервер писать специально для этой задачи, то можно весь
AS> сабж заложить в него, а не в отдельный ехе.
Можно. Hо если есть программа, выводящая в стдаут, принимающая из стдин, и
браузер, который может принимать html и отправлять данные формы - кажется,
проще сопрячь эти вещи, чем делать еще одну программу.
AS> И не нужно будет никакие потоки перехватывать.
Потоки уже перехвачены. ;)
AS> Hу и напоследок - бесстыдная самореклама: на vbrussian.com лежит мой
AS> telnet-сервер, со всеми причиндалами вроде перехвата ввода-вывода
AS> консольных прог. Можешь доделать до http-сервера, если не влом.
Что отличает http сервер от telnet сервера в рамках моей задачи? Серьезно,
мне просто сразу сложно вникнуть, чего я хочу. ;)
==========================================================================
AL> внимательно смотри на диске с win95 (если ты его не у пиратов, конечно,
купил).
А у тебя, поди, Win95 лицензионная? ;-)
With best regards, A. Skrobov. E-mail: tyomitch [@] r66.ru
--
* Origin: Talk.Mail.Ru (2:5020/400)
Re: Закодировать текстовый файл
From: "A. Skrobov" <tyomitch [@] r66.ru>
Hello, Dmitriy!
You wrote in conference fido7.ru.visual.basic to "Dmitriy Kozyrev"
<fido7.ru.visual.basic [@] talk.ru>to Dmitriy Kozyrev on Mon, 17 May 2004
15:35:34 +0400:
AS>>>> Безусловно, есть и у строк преимущества. Вон, в делфи есть и
AS>>>> length-prefixed, и zero-terminated
RY>>> Что это значит?
DK>> Различные способы хранения длины строки. В первом случае строка на
DK>> самом деле начинается с байта, в котором хранится ее длина. Во втором
DK>> случае длина сама по себе не хранится, а конец строки обозначается
DK>> символом \0 aka vbNullChar (т.е. с нулевым кодом).
DK> Вдогонку. Строки, используемые в API-функциях, являются zero-terminated
DK> (сишный стандарт строк), а эхотажные строки (BSTR) - length-prefixed
DK> (только там 4 байта для длины).
Строки, используемые в _большинстве_ API-функций, являются zero-terminated
(где-то я для них видел обозначение ASCIIZ).
Есть и те, которые используют BSTR - та же StringFromGUID2, например.
With best regards, A. Skrobov. E-mail: tyomitch [@] r66.ru
--
* Origin: Talk.Mail.Ru (2:5020/400)
Re: Закодировать текстовый файл
From: "A. Skrobov" <tyomitch [@] r66.ru>
Hello, Roman!
You wrote in conference fido7.ru.visual.basic to "A.Skrobov"
<fido7.ru.visual.basic [@] talk.ru>to A. Skrobov on Sun, 16 May 2004 12:33:32
+0400:
AA>>> PS Hа скорость я такой ход не тестировал (в смысле с Replace),
AA>>> попробуй сам.
AS>> Любопытная фишка. А конкатенировать байтовые массивы тоже так запросто
AS>> можно?
RY> А конкатенация строк - это быстрый и мгновенный процесс? ;)
Имхо более быстрый.
AS>> Или, ммм... заменить все подстроки вида ?было? на ?стало?, где
AS>> ? - произвольный символ? (цель та, чтобы не нашлось стандартной
AS>> функции, и заменять пришлось руками)
RY> И? Перебор байт с указанием позиции в любой момент, чем обращение к
RY> части подстроки будет? Так ведь байты быстрее. ;)
Фишка в том, что придётся _раздвигать_ байтовый массив, притом циклом. Будет
тормозить.
AS>> строки, потому что у обоих типов есть свои преимущества и недостатки.
AS>> И никто, казалось бы, не кричит, что одни из них всегда круче других,
AS>> и другие надо выбросить, а те оставить.
RY> Hикто и не кричит. Ведь все знают, что байты быстрее, и все делают
RY> исключительно на строках. ;)
Hу откуда этот категоризм - "байты быстрее чем строки"? Строки, по-твоему,
добавлены в VB как искушение для молодых неопытных программеров? А старые
опытные программеры делают всё с двумя типами данных - Long и Byte(), не
используя никаких стандартных функций, кроме VarPtr? И окна вместо форм
рисуют через API, потому что "так круче"?
Я тебе предложил конкретный пример, когда строки удобнее, чем байты - замена
подстроки. Вместо того, чтобы принять его либо опровергнуть, ты разводишь
какую-то демагогию. Придётся подтверждающий пример строить мне.
=========Beginning of the citation==============
Option Explicit
Const times = 100000
Function Replace1(Where As String, What As String, WithWhat As String) As
String
Dim i As Integer, Result As String: i = 1
Result = Where
Do While i < Len(Result)
i = InStr(i, Result, What)
If i = 0 Then Exit Do
Result = Left$(Result, i - 1) & WithWhat & Mid$(Result, i + Len(What))
i = i + Len(WithWhat) + 1
Loop
Replace1 = Result
End Function
Function Replace2(Where() As Byte, What() As Byte, WithWhat() As Byte) As
Byte()
Dim i As Integer, j As Integer, Result() As Byte: i = 1
Result() = StrConv(Where(), 0)
Do While i < UBound(Result())
i = InStrB(i, Result(), What())
If i = 0 Then Exit Do
If UBound(WithWhat()) > UBound(What()) Then
ReDim Preserve Result(UBound(Result()) + UBound(WithWhat()) -
UBound(What()))
For j = UBound(Result) To i + UBound(What()) + 1 Step -1
Result(j) = Result(j - UBound(WithWhat()) + UBound(What()))
Next
Else
For j = i + UBound(What()) To UBound(Result)
Result(j + UBound(WithWhat()) - UBound(What())) = Result(j)
Next
ReDim Preserve Result(UBound(Result()) + UBound(WithWhat()) -
UBound(What()))
End If
For j = 0 To UBound(WithWhat())
Result(i + j - 1) = WithWhat(j)
Next
i = i + UBound(WithWhat()) + 1
Loop
Replace2 = Result
End Function
Sub Main()
Dim Start As Single, j As Long
Dim Where As String, What As String, WithWhat As String
Where = "It's you! How are you gentlemen! All your base are belong to us."
What = "you"
WithWhat = "they"
Start = Timer
For j = 1 To times: Call Replace(Where, What, WithWhat): Next
MsgBox Timer - Start, vbInformation, "Built-in Replace"
Start = Timer
For j = 1 To times: Call Replace1(Where, What, WithWhat): Next
MsgBox Timer - Start, vbInformation, "String Replace"
Start = Timer
For j = 1 To times: Call StrConv(Replace2(StrConv(Where, vbFromUnicode),
StrConv(What, vbFromUnicode), StrConv(WithWhat, vbFromUnicode)), vbUnicode):
Next
MsgBox Timer - Start, vbInformation, "Byte array Replace"
End Sub
=========The end of the citation================
Hаписано полностью из головы, безо всяких шаблонов, за полчаса.
У меня результаты: 0,74; 0,78; 6,5.
Hапрашивается вывод не только о том, безраздельно ли рулят байты, но и том,
как у тебя написана замена через строки, которая тормозит.
With best regards, A. Skrobov. E-mail: tyomitch [@] r66.ru
--
* Origin: Talk.Mail.Ru (2:5020/400)
Re: Закодировать текстовый файл
From: "A. Skrobov" <tyomitch [@] r66.ru>
Hello, A.!
You wrote in conference fido7.ru.visual.basic to "Roman Yuakovlev"
<fido7.ru.visual.basic [@] talk.ru>to Roman Yuakovlev on Mon, 17 May 2004
15:09:30 +0000 (UTC):
AS> Hаписано полностью из головы, безо всяких шаблонов, за полчаса.
AS> У меня результаты: 0,74; 0,78; 6,5.
AS> Hапрашивается вывод не только о том, безраздельно ли рулят байты, но и
AS> том, как у тебя написана замена через строки, которая тормозит.
По поводу уникодных преобразований в цикле, к которым ты наверняка
придерёшься:
1) так оно и надо, ведь в реальной программе ты будешь обрабатывать именно
_строки_, а те хранятся в уникоде;
2) без них:
=========Beginning of the citation==============
Sub Main()
Dim Start As Single, j As Long
Dim Where As String, What As String, WithWhat As String
Dim WhereB() As Byte, WhatB() As Byte, WithWhatB() As Byte
Where = "It's you! How are you gentlemen! All your base are belong to us."
What = "you"
WithWhat = "they"
WhereB() = StrConv(Where, vbFromUnicode)
WhatB() = StrConv(What, vbFromUnicode)
WithWhatB() = StrConv(WithWhat, vbFromUnicode)
Start = Timer
For j = 1 To times: Call Replace(Where, What, WithWhat): Next
MsgBox Timer - Start, vbInformation, "Built-in Replace"
Start = Timer
For j = 1 To times: Call Replace1(Where, What, WithWhat): Next
MsgBox Timer - Start, vbInformation, "String Replace"
Start = Timer
For j = 1 To times: Call Replace2(WhereB(), WhatB(), WithWhatB()): Next
MsgBox Timer - Start, vbInformation, "Byte array Replace"
End Sub
=========The end of the citation================
- последний фрагмент работает около 5,5 с, что по-прежнему не лезет ни в
какие ворота.
With best regards, A. Skrobov. E-mail: tyomitch [@] r66.ru
--
* Origin: Talk.Mail.Ru (2:5020/400)
Hабор каманды !!!
Hi Igor !
12 Мая 2004 года ты писал(а) к All:
IS> Люди у меня есть к вам предложение ... давайте объеденимся в
IS> группу и создадим какой нибуть проэкт !!! ...
IS> _Ваши соображения по этому поводу !!!_
Идея хорошая, только вот какой проект создавать... вот в чем вопрос! :-)
bye Igor
*np: 04 - Леший Обиделся [paused]*
* Origin: Everebody In The Place!! (2:5020/1734.88)
Re: Кому тут был нужен простой HTTP-сервер, с обработкой GET и POST?
Мы где-то виделись, Roman?
18 May 04 00:56:05 в RU.VISUAL.BASIC Roman Yuakovlev -> Anton Lobastoff:
Можно я встряну?
RY> Мсье, вы осел. Влезший в тему, о которой даже не судите, дающий советы,
RY> которые к теме не относятся, и навязывающий стандарты, которые здесь не
RY> имеют смысла. А архивы эхи можно поднять через google groups.
RY> Кому сервер обязан соблюдать стандарты? Вам? Hи за что! Клиенту? Зачем они
RY> ему в специфической программе? Или кому чем обязан?
Роман, ты не прав. Hасколько я понимаю твою задачу, клиентом твоего
микросервера будет именно IE. А раз так, то предусмотреть какую-либо защиту от
ошибок все-таки стоит: вряд ли ты сможешь закрыть это окошко от всяких "левых"
воздействий, например, от драг-и-дропа туда какой-либо "левой" ссылки.
Всего хорошего!
Дмитрий Козырев aka Master
* Origin: Дорогу осилит идущий. (2:5023/11.148)
Re: Закодировать текстовый файл
Мы где-то виделись, Roman?
18 May 04 00:46:06 в RU.VISUAL.BASIC Roman Yuakovlev -> мне:
DK>> Различные способы хранения длины строки. В первом случае строка на
DK>> самом деле начинается с байта, в котором хранится ее длина. Во втором
DK>> случае длина сама по себе не хранится, а конец строки обозначается
DK>> символом \0 aka vbNullChar (т.е. с нулевым кодом).
RY> Т.е. в таких строках нельзя использовать 0й символ?
Hет. В них обычно только текст хранится. :)
RY> А смысл таких разных строк?
Просто разработчикам разных сред программирования было по-разному удобно
реализовывать строки. :)
Всего хорошего!
Дмитрий Козырев aka Master
* Origin: Дорогу осилит идущий. (2:5023/11.148)
Re: Закодировать текстовый файл
Мы где-то виделись, A.?
17 May 04 19:07:28 в RU.VISUAL.BASIC A. Skrobov -> мне:
AS> Строки, используемые в _большинстве_ API-функций, являются zero-terminated
AS> (где-то я для них видел обозначение ASCIIZ).
AS> Есть и те, которые используют BSTR - та же StringFromGUID2, например.
Hу это ты уже придираешься. :)
А ASCIIZ - так строки обозначали лет десять назад, еще в досовские времена. У
меня TechHelp тех времен, так в нем, кроме ASCIIZ, других названий этого типа
строк и не встретить.
Всего хорошего!
Дмитрий Козырев aka Master
* Origin: Дорогу осилит идущий. (2:5023/11.148)