Можно ли в VB работать с Null Terminated String???

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
0xy
Бывалый
Бывалый
 
Сообщения: 223
Зарегистрирован: 14.06.2006 (Ср) 2:34

Можно ли в VB работать с Null Terminated String???

Сообщение 0xy » 16.12.2009 (Ср) 22:51

Хотелось бы создать массив из онных :cool:

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Можно ли в VB работать с Null Terminated String???

Сообщение Хакер » 16.12.2009 (Ср) 23:12

То есть ты считаешь себя профессионалом, и соответственно считаешь, что уровень профессионала находится ниже, чем уровень, требуемый для ответа на этот вопрос?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Debugger
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1667
Зарегистрирован: 17.06.2006 (Сб) 15:11

Re: Можно ли в VB работать с Null Terminated String???

Сообщение Debugger » 16.12.2009 (Ср) 23:13

Эмм...
Ты хоть знаешь, что это такое? Походу нет.
Код: Выделить всё
Dim a(2) As String

P.S. Насколько я помню, строки в VB6 являют null-terminated (сказал API-Guide).
P.S.S.
Этот раздел не предназначен для того, чтобы вы адресовали свою проблему профессионалам.

0xy
Бывалый
Бывалый
 
Сообщения: 223
Зарегистрирован: 14.06.2006 (Ср) 2:34

Re: Можно ли в VB работать с Null Terminated String???

Сообщение 0xy » 17.12.2009 (Чт) 5:00

String--эт конечно круто! :D))) Только с чего вы взяли, что он Null Terminated?
Под Null-Terminated я подразумеваю (текстовые) строки, не имеющие дескриптора длины, и ограниченые ИСКЛЮЧИТЕЛЬНО финальным нулем. ;) String же может содержать любые символы (в т.ч. нули в любом колличестве), и руководствуется исключительно дескриптором.

Меня же интересует, возможно ли научить VB понимать этот тип данных, в частности, поднимать из файла такие массивы (без ручной обработки)?
[Viper] :: Тему переношу. Устное предупреждение.

Денис
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2734
Зарегистрирован: 07.11.2006 (Вт) 13:55
Откуда: Ейск, Краснодарский край

Re: Можно ли в VB работать с Null Terminated String???

Сообщение Денис » 17.12.2009 (Чт) 8:52

0xy писал(а):Меня же интересует, возможно ли научить VB понимать этот тип данных, в частности, поднимать из файла такие массивы (без ручной обработки)?


Это называется байтовые массивы. Делаем так:
Dim ByteArr() as Byte
Добавляем Chr$(0) в конец и работаем с этим как со строкой (ну, не без подводных камней, конечно, но всё же).
ByteArr = "Hello World!" & Chr$(0)

А вот как сделать масиив из байтовых массивов, эт я уже не знаю :?
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Можно ли в VB работать с Null Terminated String???

Сообщение Хакер » 17.12.2009 (Чт) 12:24

Меня же интересует, возможно ли научить VB понимать этот тип данных

Невозможно, поскольку это нарушает концепцию безопасного управления памятью.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Денис
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2734
Зарегистрирован: 07.11.2006 (Вт) 13:55
Откуда: Ейск, Краснодарский край

Re: Можно ли в VB работать с Null Terminated String???

Сообщение Денис » 17.12.2009 (Чт) 14:13

0xy писал(а):в частности, поднимать из файла такие массивы (без ручной обработки)?


:shock:

Что ты под этим подразумеваешь, бедный, искалеченый паскалем человек?

Что тебе мешает "поднять" информацию из файла?
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.

0xy
Бывалый
Бывалый
 
Сообщения: 223
Зарегистрирован: 14.06.2006 (Ср) 2:34

Re: Можно ли в VB работать с Null Terminated String???

Сообщение 0xy » 18.12.2009 (Пт) 0:59

Денис
Про Hello world не в тему: разделительные нушли уже есть в файле.

Разобрать такой файл вручную несложно. Но прежде, чем извращаться, я решил узнать о возможностях языка в этом плане...

Денис
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2734
Зарегистрирован: 07.11.2006 (Вт) 13:55
Откуда: Ейск, Краснодарский край

Re: Можно ли в VB работать с Null Terminated String???

Сообщение Денис » 18.12.2009 (Пт) 10:31

0xy писал(а):разделительные нули уже есть в файле.

Так, давайте разберемся, что хранится в файле? Записи, разделенные нулями? Или Массив? Или структура?
0xy писал(а):Разобрать такой файл вручную несложно. Но прежде, чем извращаться, я решил узнать о возможностях языка в этом плане...

Я еще раз предлагаю прояснить, что в Вашем понимании ручной разбор, а что - автоматический.

Всё это нам потребуется в дальнейшем, чтобы понять какой String нужен, и обязательно ли Null terminated?
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.

0xy
Бывалый
Бывалый
 
Сообщения: 223
Зарегистрирован: 14.06.2006 (Ср) 2:34

Re: Можно ли в VB работать с Null Terminated String???

Сообщение 0xy » 18.12.2009 (Пт) 17:54

В файле--строки, ограниченные нулями (запмси, разделенные нулями).

Ручной разбор выглядит так:
Код: Выделить всё
Sub ReadSTR(ArrSTR$(), FileName$)
Dim fBuffer() As Byte, fHandle&, i&, j&, k&
fHandle = FreeFile
Open FileName For Binary Access Read Shared As fHandle
ReDim fBuffer(1 To LOF(fHandle))
Get fHandle, , fBuffer
Close fHandle
ReDim ArrSTR(0 To 0)
k = 1
For i = 1 To UBound(fBuffer)
    If fBuffer(i) = 0 Then
        ReDim Preserve ArrSTR(0 To UBound(ArrSTR) + 1)
        For j = k To i
            ArrSTR(UBound(ArrSTR)) = ArrSTR(UBound(ArrSTR)) & Chr(fBuffer(j))
         Next j
    k = i + 1
    End If
Next
End Sub


Ну а автоматически--что-то вроде:
Dim fBuffer() as NullTerminatedString ' :)
Get fHandle,,fBuffer
Но, как я понял, такого не бывает?

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Re: Можно ли в VB работать с Null Terminated String???

Сообщение Viper » 18.12.2009 (Пт) 18:46

А что, функцию Split не судьба поиспользовать?
Весь мир матрица, а мы в нем потоки байтов!

burik
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 514
Зарегистрирован: 03.11.2005 (Чт) 22:04
Откуда: Беларусь, Рогачев

Re: Можно ли в VB работать с Null Terminated String???

Сообщение burik » 18.12.2009 (Пт) 19:21

Ну как минимум ни к чему проходить всю последовательность два раза. Можно за один разбить.
Код: Выделить всё
    ReDim ArrSTR(1 To 1)
    k = 1
    For i = 1 To UBound(fBuffer)
        ArrSTR(k) = ArrSTR(k) & Chr(fBuffer(i))
        If fBuffer(i) = 0 Then
            ReDim Preserve ArrSTR(0 To k + 1)
            k = k + 1
        End If
    Next
Между слухов, сказок, мифов,
просто лжи, легенд сомнений
мы враждуем жарче скифов
за несходство заблуждений
Игорь Губерман

djalex777
Постоялец
Постоялец
 
Сообщения: 461
Зарегистрирован: 23.03.2006 (Чт) 16:02

Re: Можно ли в VB работать с Null Terminated String???

Сообщение djalex777 » 18.12.2009 (Пт) 19:41

0xy писал(а):Ну а автоматически--что-то вроде:
Dim fBuffer() as NullTerminatedString ' :)
Get fHandle,,fBuffer
Но, как я понял, такого не бывает?

Для разделителей 0 врят ли (если только строки фиксированной длины), но вобще автоматически бывает. Для сохранения и загрузки можно использовать структуру с массивом строк к примеру.

0xy
Бывалый
Бывалый
 
Сообщения: 223
Зарегистрирован: 14.06.2006 (Ср) 2:34

Re: Можно ли в VB работать с Null Terminated String???

Сообщение 0xy » 18.12.2009 (Пт) 20:08

Viper писал(а):А что, функцию Split не судьба поиспользовать?

Можно по подробнее, что за зверь? (Access 97 не знает такой буквы, а справки по VB6 (MSDN) у меня нет :( )

djalex777
Можете привести пример со структурой?

burik
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 514
Зарегистрирован: 03.11.2005 (Чт) 22:04
Откуда: Беларусь, Рогачев

Re: Можно ли в VB работать с Null Terminated String???

Сообщение burik » 18.12.2009 (Пт) 20:18

0xy писал(а): Viper писал(а):А что, функцию Split не судьба поиспользовать?
Можно по подробнее, что за зверь? (Access 97 не знает такой буквы, а справки по VB6 (MSDN) у меня нет :( )

И это тот человек, который постит в раздел для профессионалов?

MSDN писал(а):Returns a zero-based, one-dimensional array containing a specified number of substrings.
Syntax
Split(expression[, delimiter[, limit[, compare]]])
Последний раз редактировалось burik 18.12.2009 (Пт) 20:40, всего редактировалось 1 раз.
Между слухов, сказок, мифов,
просто лжи, легенд сомнений
мы враждуем жарче скифов
за несходство заблуждений
Игорь Губерман

djalex777
Постоялец
Постоялец
 
Сообщения: 461
Зарегистрирован: 23.03.2006 (Чт) 16:02

Re: Можно ли в VB работать с Null Terminated String???

Сообщение djalex777 » 18.12.2009 (Пт) 20:37

0xy писал(а):Можете привести пример со структурой?

Объявляем:
Код: Выделить всё
type t
s() as string
end type


Заполнение и сохранение структуры:
Код: Выделить всё
...
dim tt as t, i as long
redim tt.s(0 to 30)
for i = 0 to 30
tt.s(i) = "любая строка"
next i
...
dim frf as integer
frf=freefile
open "имя файла" for binary as #frf
put #frf,,tt
close #frf
...


Загрузка структуры:
Код: Выделить всё
...
dim tt as t,frf as integer
frf=freefile
open "имя файла" for binary as #frf
get #frf,,tt
close #frf
...

0xy
Бывалый
Бывалый
 
Сообщения: 223
Зарегистрирован: 14.06.2006 (Ср) 2:34

Re: Можно ли в VB работать с Null Terminated String???

Сообщение 0xy » 18.12.2009 (Пт) 21:27

djalex777
Это полный бред! ;)

burik
Какая переменная должна быть на выходе split? (неплохо бы увидеть пример вызова)
Походу, в Access97 точно не работает.

burik
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 514
Зарегистрирован: 03.11.2005 (Чт) 22:04
Откуда: Беларусь, Рогачев

Re: Можно ли в VB работать с Null Terminated String???

Сообщение burik » 18.12.2009 (Пт) 21:38

Код: Выделить всё
Dim sStr    As String, sDl As String
Dim sRs()   As String

    sDl = Chr$(0)
    sStr = "first string" & sDl & "second string" & sDl & "third string"
    sRs = Split(sStr, sDl)

В sRs получи массив строк, пронумерованный начиная с нуля:
sRs(0) = "first string"
sRs(1) = "second string"
sRs(2) = "third string"
Между слухов, сказок, мифов,
просто лжи, легенд сомнений
мы враждуем жарче скифов
за несходство заблуждений
Игорь Губерман

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Re: Можно ли в VB работать с Null Terminated String???

Сообщение Viper » 18.12.2009 (Пт) 22:04

0xy писал(а):Походу, в Access97 точно не работает.
Может перенести в VBA?
Весь мир матрица, а мы в нем потоки байтов!

0xy
Бывалый
Бывалый
 
Сообщения: 223
Зарегистрирован: 14.06.2006 (Ср) 2:34

Re: Можно ли в VB работать с Null Terminated String???

Сообщение 0xy » 19.12.2009 (Сб) 0:12

Viper
?? Откуда перенести? А "в Access97"--это, по-вашему, где? :)

burik
Понял, спасибо.
Только в данной задаче исходному String неоткуда взяться, так что таки не судьба.

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Re: Можно ли в VB работать с Null Terminated String???

Сообщение Viper » 19.12.2009 (Сб) 0:49

0xy писал(а):Viper
?? Откуда перенести? А "в Access97"--это, по-вашему, где? :)
Имеется ввиду подфорум VBA.
0xy писал(а):Только в данной задаче исходному String неоткуда взяться, так что таки не судьба.
А что есть то? Массив байт чем не строка?
Весь мир матрица, а мы в нем потоки байтов!

burik
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 514
Зарегистрирован: 03.11.2005 (Чт) 22:04
Откуда: Беларусь, Рогачев

Re: Можно ли в VB работать с Null Terminated String???

Сообщение burik » 19.12.2009 (Сб) 10:07

В любом случае, Split ведь будет медленнее чем простой ручной разбор.
Между слухов, сказок, мифов,
просто лжи, легенд сомнений
мы враждуем жарче скифов
за несходство заблуждений
Игорь Губерман

Debugger
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1667
Зарегистрирован: 17.06.2006 (Сб) 15:11

Re: Можно ли в VB работать с Null Terminated String???

Сообщение Debugger » 19.12.2009 (Сб) 12:58

2 burik: Разве?
2 0xy
String--эт конечно круто! ))) Только с чего вы взяли, что он Null Terminated?
Накатал пример, который доказывает, что можно использовать String как null-terminated.
Хотелось бы создать массив из онных

Код: Выделить всё
Dim Ar() As NullTerminatedString
Вложения
NTS.rar
(2.01 Кб) Скачиваний: 68

burik
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 514
Зарегистрирован: 03.11.2005 (Чт) 22:04
Откуда: Беларусь, Рогачев

Re: Можно ли в VB работать с Null Terminated String???

Сообщение burik » 19.12.2009 (Сб) 13:22

Debugger писал(а):2 burik: Разве?

Извиняюсь. Проверил - Split намного быстрее. Я почему-то думал, что будет наоборот..
Между слухов, сказок, мифов,
просто лжи, легенд сомнений
мы враждуем жарче скифов
за несходство заблуждений
Игорь Губерман

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Re: Можно ли в VB работать с Null Terminated String???

Сообщение Viper » 19.12.2009 (Сб) 13:35

burik писал(а):
Debugger писал(а):2 burik: Разве?

Извиняюсь. Проверил - Split намного быстрее. Я почему-то думал, что будет наоборот..
Проверял компилированный файл или в среде запускал?
Весь мир матрица, а мы в нем потоки байтов!

0xy
Бывалый
Бывалый
 
Сообщения: 223
Зарегистрирован: 14.06.2006 (Ср) 2:34

Re: Можно ли в VB работать с Null Terminated String???

Сообщение 0xy » 19.12.2009 (Сб) 13:47

Viper писал(а):А что есть то? Массив байт чем не строка?

Как минимум тем, что Split ее не скушает :)

Debugger
Интересная инфа! Действительно, GetWindowText выдает чистый NullTerminated и дескриптора точно не создает, а String это нормально проглотил!

Тогда, по-идее, должно сработать такое "преобразование":
Код: Выделить всё
CallWindowProc(pCode,pByteArrey,pString)
{Code == Mov pString, pByteArrey}
Последний раз редактировалось 0xy 21.12.2009 (Пн) 18:44, всего редактировалось 1 раз.

0xy
Бывалый
Бывалый
 
Сообщения: 223
Зарегистрирован: 14.06.2006 (Ср) 2:34

Re: Можно ли в VB работать с Null Terminated String???

Сообщение 0xy » 19.12.2009 (Сб) 14:45

Не-а, так внаглую не проходит--падает. Видимо, нужно таки заливать строку.

burik
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 514
Зарегистрирован: 03.11.2005 (Чт) 22:04
Откуда: Беларусь, Рогачев

Re: Можно ли в VB работать с Null Terminated String???

Сообщение burik » 19.12.2009 (Сб) 15:13

Viper писал(а):Проверял компилированный файл или в среде запускал?

И так и так проверял.
Между слухов, сказок, мифов,
просто лжи, легенд сомнений
мы враждуем жарче скифов
за несходство заблуждений
Игорь Губерман

0xy
Бывалый
Бывалый
 
Сообщения: 223
Зарегистрирован: 14.06.2006 (Ср) 2:34

Re: Можно ли в VB работать с Null Terminated String???

Сообщение 0xy » 19.12.2009 (Сб) 15:31

Хм, строка почему-то заливается криво (увидеть содержимое невозможно) :(

Код: Выделить всё
Private Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" _
           (ByVal pBinaryCode As Long, _
            ByVal Variable As Long, _
            Optional ByVal lMSG As Long, _
            Optional ByVal lp3 As Long, _
            Optional ByVal lp4 As Long) As Long
Dim a() As Byte
ReDim a(4)
a(1) = &H30
a(2) = &H32
a(3) = 0
a(4) = &H33
Arrey2String = ByteArr2String(a)
Stop

Function ByteArr2String$(ByteArr() As Byte)
Const Asm$ = "55 8B EC 60 8B 4D 10 8B 7D 0C 8B 75 08 89 4F FC F3 A4 61 5D C2 10 00 "
Dim BinaryCode() As Byte, i&
ReDim BinaryCode(1 To Len(Asm) / 3)
For i = 1 To Len(Asm) / 3  ' заполняем массив ASM-кода
    BinaryCode(i) = Val("&h" & (Mid(Asm, (i - 1) * 3 + 1, 2)))
Next
CallWindowProc VarPtr(BinaryCode(1)), VarPtr(ByteArr(1)), VarPtr(ByteArr2String), UBound(ByteArr)
'    55            PUSH EBP
'    8BEC          MOV EBP,ESP
'    60            PUSHAD
'    8B4D 10       MOV ECX,DWORD PTR SS:[EBP+10]
'    8B7D 0C       MOV EDI,DWORD PTR SS:[EBP+C]
'    8B75 08       MOV ESI,DWORD PTR SS:[EBP+8]
'    894F FC       MOV DWORD PTR DS:[EDI-4],ECX
'    F3:A4         REP MOVS BYTE PTR ES:[EDI],BYTE PTR DS:[ESI]
'    61            POPAD
'    5D            POP EBP
'    C2 1000       RET 10
End Function

Может, я неправильно представляю себе формат String? Я исходил из того, что дескриптор (Long) идет непосредственно перед данными, а VarPtr возвращает указатель на начало тела строки. Верно?

djalex777
Постоялец
Постоялец
 
Сообщения: 461
Зарегистрирован: 23.03.2006 (Чт) 16:02

Re: Можно ли в VB работать с Null Terminated String???

Сообщение djalex777 » 19.12.2009 (Сб) 16:59

0xy писал(а):Верно?

Нет. String это BSTR. А VarPtr от String это адрес BSTR
А зачем пробелы в Asm$? VarPtr(ByteArr2String) - это как?

След.

Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: AhrefsBot и гости: 22

    TopList