Страница: 1 | 2 |
Вопрос: Новое сообщение без темы
Добавлено: 29.10.04 11:24
Автор вопроса: LamerOnLine | ICQ: 334781088
subject=Массив из строки
Проблема - есть строка в Unicode, которая содержит несколько vbNullChar. Мне
нужно ее перегнать в массив типа Byte. Как это сделать побыстрее (то есть не
циклами). АПИ в основном работают с null-terminated strings, посему тут не
годятся. Как?
Ответы
Всего ответов: 21
Номер ответа: 1
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #1
Добавлено: 29.10.04 12:59
Вообще-то и АПИ сгодятся, если помучать декларации, а VB средство, попробуй так:
bt() = StrConv(strUnicode, vbFromUnicode)
Номер ответа: 2
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #2
Добавлено: 29.10.04 14:38
Sne, это не рулит. Я же говорю, строка - набор NTS. StrConv и многие API
оставляют лишь первую из них.
Номер ответа: 3
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #3
Добавлено: 29.10.04 15:13
может помочь написать ассемблерную вставку?
Номер ответа: 4
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #4
Добавлено: 29.10.04 15:14
ЗЫ (забыл)
Быстрей этого уже все-равно не получится
Номер ответа: 5
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #5
Добавлено: 31.10.04 00:24
А CopyMemory???
Номер ответа: 6
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #6
Добавлено: 31.10.04 00:35
а смысл, там же все-равно нулевый байты останутся
Номер ответа: 7
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #7
Добавлено: 31.10.04 03:55
Да уж, оно тут совсем никак
Номер ответа: 8
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #8
Добавлено: 31.10.04 03:58
Тогда на АСМ-е. Оно конечно некрасиво будет смотреться в VB, зато очень быстро.
Номер ответа: 9
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #9
Добавлено: 31.10.04 05:13
Попробуй такое:
Private Declare Function CallWindowProc Lib "user32.dll" Alias "CallWindowProcA" ( _
ByVal lpPrevWndFunc As Long, _
ByVal hwnd As Long, _
ByVal msg As Long, _
ByVal wParam As Long, _
ByVal lParam As Long) As Long
Dim StrConv2() As Byte
Sub Hex2Bin2(ByRef Source As String, ByRef Destination() As Byte)
ReDim Destination(Len(Source) \ 2)
Dim Convert As Long, DstCounter As Long
For Convert = 1 To Len(Source) Step 2
 estination(DstCounter) = Val("&H" & Mid$(Source, Convert, 2))
 stCounter = DstCounter + 1
Next Convert
End Sub
Private Sub Form_Click()
Dim a As String, b() As Byte
a = "Hello World!"
ReDim b(Len + 1)
CallWindowProc VarPtr(StrConv2(0)), StrPtr, Len, VarPtr(b(0)), 0
MsgBox StrConv(b(), vbUnicode)
End Sub
Private Sub Form_Load()
Const HexCode As String = "5589E553565781EC0C0000008B75088B7D108B4D0C668B0688" & _
"0781C602000000FFC7FFC981F9000000000F8405000000E9E0" & _
"FFFFFF9089EC81EC0C0000005F5E5B5DC21000"
Hex2Bin2 HexCode, StrConv2
End Sub
Номер ответа: 10
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #10
Добавлено: 31.10.04 05:19
Если захочешь подправить, то вот исходник для LocASM:
const Source equ ebp+8
const SrcLen equ ebp+12
Const Dst equ ebp+16
MOV esi,[Source]
mov edi,[Dst]
mov ecx,[SrcLen]
Copy:
MOV ax,[esi]
mov [edi],al
add esi,2
inc edi
dec ecx
CMP ECX,0
JE Finish
jmp Copy
Finish:
nop
Номер ответа: 11
Автор ответа:
DaSharm
ICQ: 780477
Вопросов: 72
Ответов: 1297
Web-сайт:
Профиль | | #11
Добавлено: 31.10.04 10:13
ЗАчем?В Unicode NullString не играют никакой роли, это в ASCII нужно париться с такой фигней!
Dim a As String
a = "a" & vbNullString & "b"
Print StrConv(a, vbUnicode)
Номер ответа: 12
Автор ответа:
DaSharm
ICQ: 780477
Вопросов: 72
Ответов: 1297
Web-сайт:
Профиль | | #12
Добавлено: 31.10.04 10:14
ой, глюк, в предыдущем примере замените vbNullString на vbNullChar. Юникод рулит!
Номер ответа: 13
Автор ответа:
DaSharm
ICQ: 780477
Вопросов: 72
Ответов: 1297
Web-сайт:
Профиль | | #13
Добавлено: 31.10.04 10:18
сори, сори...Невнимательно прочёл вопрос. Внатуре, когда без цикла переводишь, то режет по vbNullChar
Номер ответа: 14
Автор ответа:
DaSharm
ICQ: 780477
Вопросов: 72
Ответов: 1297
Web-сайт:
Профиль | | #14
Добавлено: 31.10.04 10:20
хотя....нэ!SNE был прав, эго код работает хорошо..
Dim a As String
Dim c() As Byte
a = "a" & vbNullChar & "b" & vbNullChar & "c"
c() = StrConv(a, vbFromUnicode)
MsgBox Chr(c(4))
Номер ответа: 15
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #15
Добавлено: 31.10.04 23:55
о тожж... бывают чудеса