Страница: 1 |
Страница: 1 |
Вопрос: myArray() = myString$ 'как иначе?
Добавлено: 07.08.06 07:07
Автор вопроса: Dr. Zwoo4 | ICQ: 319248917
Действительно? Я в курсе, что строки в VB это не массивы, как в Ц, например. Мало того - они "двухбайтные", ака Unicode.
где то выше 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-сайт:
Профиль | | #1
Добавлено: 07.08.06 11:59
Dim b() As Byte
a = "Preved"
b = StrConv(a, vbFromUnicode)
Номер ответа: 2
Автор ответа:
GSerg
Вопросов: 0
Ответов: 1876
Профиль | | #2
Добавлено: 07.08.06 12:01
Ты пока сам не понимаешь, чего хочешь.
Прямое присваивание, на самом деле, делает именно то, что ты хочешь, но почему-то ты этого не понимаешь.
Присваивание через StrConv даст тебе чисто байтовый массив, но его содержимое будет верно только если на компе стоит определённая локаль; а для определённых языков - не будет верно вообще.
Впрочем, судя по этому коду, тебу нужна первая половина строки. Зачем, интересно?
Номер ответа: 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
Прямое присваивание делает именно то, что надо. Не спорю. Но, грубо, тупо, по - проще объясняясь мне нужно вот что:
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. Проблем никаких.