Visual Basic, .NET, ASP, VBScript
 

   
   
     

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

Страница: 1 |

 

  Вопрос: myArray() = myString$ 'как иначе? Добавлено: 07.08.06 07:07  

Автор вопроса:  Dr. Zwoo4 | ICQ: 319248917 
Действительно? Я в курсе, что строки в VB это не массивы, как в Ц, например. Мало того - они "двухбайтные", ака Unicode.

Dim myArray() as Byte
где то выше Dim myString as String

myArray() = myString

Debug.Print Len(myString)         '16
Debug.Print UBound myArray()      '35

Вообщем, есть ли способ МАКСИМАЛЬНО быстро привести строку к массиву, и наоборот? По идее, единственное, что мне приходит в голову это ReDim myArray(Len(myString)-1) и затем CopyMemory(). Есть ещё способы?

Ответить

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

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


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #1
Добавлено: 07.08.06 11:59
    Dim a As String
    Dim b() As Byte
    a = "Preved"
    b = StrConv(a, vbFromUnicode)

Ответить

Номер ответа: 2
Автор ответа:
 GSerg



Вопросов: 0
Ответов: 1876


 Профиль | | #2 Добавлено: 07.08.06 12:01
Ты пока сам не понимаешь, чего хочешь.

Прямое присваивание, на самом деле, делает именно то, что ты хочешь, но почему-то ты этого не понимаешь.

Присваивание через StrConv даст тебе чисто байтовый массив, но его содержимое будет верно только если на компе стоит определённая локаль; а для определённых языков - не будет верно вообще.


ReDim myArray(Len(myString)-1) и затем CopyMemory()

Впрочем, судя по этому коду, тебу нужна первая половина строки. Зачем, интересно?

Ответить

Номер ответа: 3
Автор ответа:
 LamerOnLine



ICQ: 334781088 

Вопросов: 108
Ответов: 2822
 Профиль | | #3 Добавлено: 07.08.06 13:13
WideCharToMultiByte?

Ответить

Номер ответа: 4
Автор ответа:
 Dr. Zwoo4



ICQ: 319248917 

Вопросов: 3
Ответов: 25
 Профиль | | #4 Добавлено: 07.08.06 23:39
Прямое присваивание делает именно то, что надо. Не спорю. Но, грубо, тупо, по - проще объясняясь мне нужно вот что:
For xStep = 1& To Len(myString$)
   myArray(xStep)=Asc(Mid(myString$,xStep,1))
Next

При прямом присваивании VB автоматически занимается конвертированием строки в Юникод. А в строке находятся данные ANSI. Было бы, конечно проще сразу хранить эти данные в массиве Byte, но вопрос: можно ли помещать массивы в универсальные коллекции, без помощи классов (т.е. в коллекции должен находиться именно массив, а не класс, содержащий этот массив). Или другой способ: поместить в коллекцию указатель на указатель на массив (собственно, по-другому я себе это и не представляю)

Ответить

Номер ответа: 5
Автор ответа:
 Dr. Zwoo4



ICQ: 319248917 

Вопросов: 3
Ответов: 25
 Профиль | | #5 Добавлено: 07.08.06 23:41
Поправка к предыдущему посту: фактически в строке хранятся данные Юникод - это и ежу понятно. Но представляет интерес их ANSI представление (вынужденный каламбур)

Ответить

Номер ответа: 6
Автор ответа:
 LamerOnLine



ICQ: 334781088 

Вопросов: 108
Ответов: 2822
 Профиль | | #6 Добавлено: 08.08.06 11:24
По поводу ANSI - для того уже писали - WideCharToMultiByte, для дефолтовой локали коверти OEM в ACP.
В коллекцию можно засунуть все, что можно засунуть в Variant. VBшный байтовый массив - это SAFEARRAY, в Variant тип данных (vt) - VT_BYREF Or VT_ARRAY или просто VT_ARRAY. Проблем никаких.

Ответить

Страница: 1 |

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



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