Может ли LenB для строки вернуть нечётное число?

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Может ли LenB для строки вернуть нечётное число?

Сообщение tyomitch » 04.01.2007 (Чт) 22:47

Вопрос навеян топиком Wolfie и в нём категоричным заявлением GSerg-а об отсутствии различий между текстовыми и двоичными данными.

Так вот: в String, как известно, лежит по два байта на символ, а число символов представляется целым. И всё же, сабж?
Изображение

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 04.01.2007 (Чт) 22:59

Не дёргай категоричное заявление GSerg-а из контекста. Оно, как нетрудно видеть из истории форума, навеяно http://bbs.vbstreets.ru/viewtopic.php?p=6597008#6597008 и ниже.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 04.01.2007 (Чт) 23:03

Да нет, я всё то помню :-)
Просто в топике Wolfie, где оно уже было оторвано от своего исторического контекста, категоричное заявление GSerg-а выглядело несколько, мм... вводящим в заблуждение.

И всё же, что про сабж?
Изображение

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 04.01.2007 (Чт) 23:10

Из картинки, которую правил ты, следует, что длина хранится в байтах, а не в символах. Значит может. Особенно на фоне мыслей о кодировках с переменным числом байт на символ.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 04.01.2007 (Чт) 23:19

Тогда естественно возникает вопрос: а как такую строку получить? (родными средствами VB, без CopyMemory и прочего шаманства).
Изображение

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 04.01.2007 (Чт) 23:51

?lenb(leftb("AA",3))
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 04.01.2007 (Чт) 23:57

О как чудно! Даже кодировки с переменным числом байт на символ не понадобились :-)

Следующий вопрос: что для такой строки вернут lstrlenA(ByVal As String), lstrlenW(ByVal StrConv(vbUnicode) As String) и lstrlenW(ByVal StrPtr() As Long):?:
(Для обычной строки все три этих варианта возвращают то же значение, что и встроенная Len.)
Предлагается сначала предположить, и потом проверить :-)
Изображение

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 05.01.2007 (Пт) 0:28

1,1,2
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 05.01.2007 (Пт) 0:42

А почему?
Изображение

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 05.01.2007 (Пт) 0:57

А правильно?
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 05.01.2007 (Пт) 1:06

Лёгкий эксперимент показывает, что нет ;-)
Но всё равно интересно объяснение.
Изображение

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 05.01.2007 (Пт) 18:26

Наша строка:
41 00 41 00 00 00 (1)
StrConv просто вставляет нули после(или перед) каждого байта
StrConv: 41 00 00 00 41 00 00 00 00 (2)
lstrlenA ищет первый (char)0, lstrlenW ищет первый (short)0
Отсюда
Код: Выделить всё
lstrlenA(1) = 1
lstrlenW(2) = 1
lstrlenW(1) = 2

Почему не так?
(не могу проверить, т.к. нету времени)
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 05.01.2007 (Пт) 18:45

Потому что по твоей логике выходит, что lstrlenA вообще для любой строки вернёт 1 ;-)
Изображение

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 05.01.2007 (Пт) 19:13

Для любой Юникод-строки, получается да. А разве не должна?
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 05.01.2007 (Пт) 19:27

Гы гы :)
ANDLL, а нафига юникод, если у него каждый второй байт 00? :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 05.01.2007 (Пт) 19:35

ANDLL писал(а):Для любой Юникод-строки, получается да. А разве не должна?

Во даже как?
А как тогда в твоей статье вызов LoadLibrary("kernel32.dll") загружает именно kernel32.dll, а не k?
Там ведь LoadLibraryA, верно?
Изображение

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 05.01.2007 (Пт) 20:16

tyomitch писал(а):
ANDLL писал(а):Для любой Юникод-строки, получается да. А разве не должна?

Во даже как?
А как тогда в твоей статье вызов LoadLibrary("kernel32.dll") загружает именно kernel32.dll, а не k?
Там ведь LoadLibraryA, верно?

Потому что
VB преобразует unicode-строки в не unicode-строки при передаче в API
Если бы ты передавал strptr("kernel32") то тогда бы действительно, он бы пробовал загрузить k
2GSerg
У строки "AA" второй байт действительно 0, над чем смеемся?
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 05.01.2007 (Пт) 20:22

ANDLL писал(а):
tyomitch писал(а):
ANDLL писал(а):Для любой Юникод-строки, получается да. А разве не должна?

Во даже как?
А как тогда в твоей статье вызов LoadLibrary("kernel32.dll") загружает именно kernel32.dll, а не k?
Там ведь LoadLibraryA, верно?

Потому что
VB преобразует unicode-строки в не unicode-строки при передаче в API

Однако же, твоя теория этого не учитывает.
Изображение

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 05.01.2007 (Пт) 20:23

:lol:
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас


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

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

Сейчас этот форум просматривают: SemrushBot, Yandex-бот и гости: 95

    TopList