Преобразовании локальной ссылки

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

Преобразовании локальной ссылки

Сообщение bvv70 » 06.10.2007 (Сб) 20:56

Подскажите как из адреса файла
D:\Библиотека TXT\Зарубежные авторы\А\АЗИМОВ Айзек\В плену у Весты.txt
Получить локальную ссылку для браузера
file:///D:/%D0%91%D0%B8%D0%B1%D0%BB%D0%B8%D0%BE%D1%82
%D0%B5%D0%BA%D0%B0%20TXT/%D0%97%D0%B0%D1%80%D1%83
%D0%B1%D0%B5%D0%B6%D0%BD%D1%8B%D0%B5%20%D0%B0%
D0%B2%D1%82%D0%BE%D1%80%D1%8B/%D0%90/%D0%90%D0%97
%D0%98%D0%9C%D0%9E%D0%92%20%D0%90%D0%B9%D0%B7%D0
%B5%D0%BA/%D0%92%20%D0%BF%D0%BB%D0%B5%D0%BD%D1
%83%20%D1%83%20%D0%92%D0%B5%D1%81%D1%82%D1%8B.txt

dr.MIG
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1441
Зарегистрирован: 18.12.2004 (Сб) 9:53
Откуда: г.Ярославль

Сообщение dr.MIG » 06.10.2007 (Сб) 21:09

Hex(Asc(x)) для каждой буквы по-отдельности, где х -- буква. И перед полученным значением поставить %.
Salus populi suprema lex

bvv70
Обычный пользователь
Обычный пользователь
 
Сообщения: 55
Зарегистрирован: 22.04.2006 (Сб) 19:12

Сообщение bvv70 » 06.10.2007 (Сб) 22:01

Понял, спасибо.

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

Сообщение Хакер » 07.10.2007 (Вс) 8:55

dr.MIG
Не забывай, что Hex не возвращает ведущие нули. А значит автор встретится с таким результатом как %A

На мой взгляд гораздо луче воспользоваться функцией InternetCanonicalizeUrl или InternetCombineUrl
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

bvv70
Обычный пользователь
Обычный пользователь
 
Сообщения: 55
Зарегистрирован: 22.04.2006 (Сб) 19:12

Сообщение bvv70 » 07.10.2007 (Вс) 9:06

Хакер писал(а):dr.MIG
На мой взгляд гораздо луче воспользоваться функцией InternetCanonicalizeUrl или InternetCombineUrl

А можно с примером, сам я не разберусь.

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

Сообщение Хакер » 07.10.2007 (Вс) 9:08

Ну хотя бы так.
Код: Выделить всё
Private Declare Sub InternetCanonicalizeUrl Lib "wininet.dll" Alias "InternetCanonicalizeUrlA" (ByVal lpszBaseUrl As String, ByVal ret As Long, ByRef lpdwBufferLength As Long, ByVal dwFlags As Long)

Private Sub Form_Load()
    Dim strBuffer As String
    strBuffer = String(255, 0)
    Dim url As String
    url = "d:\мой компьютер\айзек азимов\фыв.txt"
    InternetCanonicalizeUrl url, StrPtr(strBuffer), 255, 0
    MsgBox StrConv(strBuffer, vbUnicode)
End Sub

Флагами можно настроить, что и как должно заменяться.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

dr.MIG
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1441
Зарегистрирован: 18.12.2004 (Сб) 9:53
Откуда: г.Ярославль

Сообщение dr.MIG » 07.10.2007 (Вс) 15:37

Хакер, можно использовать Format и всё будет о'k.
Ну а так да, просто я забыл, что есть такая API :oops:
Но зато автор топика теперь знает, что лежит в основе этого преобразования. :D
Salus populi suprema lex

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

Сообщение Хакер » 07.10.2007 (Вс) 16:12

dr.MIG
Твой код преобразовывает всё, например точки, которые преобразовывать не надо.

Как ты собрался использовать формат? Поделись :)

Вообще, я для этих целей всегла юзаю конструкцию
Right("0" + Hex(x), 2), Right("000" + Hex(x), 4), Right("0000000" + Hex(x), 8) (в зависимости от кол-ва необходимых ведущих нулей)
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

dr.MIG
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1441
Зарегистрирован: 18.12.2004 (Сб) 9:53
Откуда: г.Ярославль

Сообщение dr.MIG » 07.10.2007 (Вс) 16:21

Хакер писал(а):Как ты собрался использовать формат?

Format(Hex(Asc(x)), "00")
Salus populi suprema lex

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

Сообщение Хакер » 07.10.2007 (Вс) 16:27

msgbox Format(Hex(10), "00")="0A"
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

dr.MIG
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1441
Зарегистрирован: 18.12.2004 (Сб) 9:53
Откуда: г.Ярославль

Сообщение dr.MIG » 07.10.2007 (Вс) 16:30

Ну. А что требовалось получить?
Salus populi suprema lex

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

Сообщение Хакер » 07.10.2007 (Вс) 16:32

Требовалось получить True.
Format(Hex(10), "00") возвращает "A", как и Hex(10). Какой тогда смысл пропускать "A" через Format чтобы получить "A"? :)

А получить надо было "0A".
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

bvv70
Обычный пользователь
Обычный пользователь
 
Сообщения: 55
Зарегистрирован: 22.04.2006 (Сб) 19:12

Сообщение bvv70 » 07.10.2007 (Вс) 16:34

Спасибо Хакеру, код прекрасно действует: из
D:\Библиотека TXT\Зарубежные авторы\А\АБНЕТТ Дэн\Рейвенор\01_Рейвенор.txt
получается:
file://D:\Библиотека%20TXT\Зарубежные%20авторы\А\АБНЕТТ%20Дэн\Рейвенор\01_Рейвенор.txt
что отлично понимается браузером. Получается что заменить можно было только пробел?

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Сообщение iGrok » 07.10.2007 (Вс) 16:34

Доктор, ты не понял. Получается "False".
Догадываешься, почему?
label:
cli
jmp label

Lumen
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 841
Зарегистрирован: 03.12.2005 (Сб) 16:09
Откуда: Брянск

Сообщение Lumen » 07.10.2007 (Вс) 16:47

Я в таких целях обычно использую такую конструкцию:
Код: Выделить всё
Public Function MakeHex(Number, Length As Long) As String
Dim a As String
a = Hex(Number)
Do While Len(a) < Length
    a = "0" + a
Loop
MakeHex = a
End Function

Первый параметр - число (byte, integer или long), второй, думаю понятно, длина текстовой записи числа. Например, если ввызвать:
MakeHex(23117, 8), то она вернет 00005A4D.
Подпись проходит рефакторинг

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

Сообщение Хакер » 07.10.2007 (Вс) 16:50

Lumen
1) Сравни скорости выполнения твоей и моей конструкции.
2) Нет никакой необходимости в переменной a. VB, правда, умный, всё равно уберёт.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

dr.MIG
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1441
Зарегистрирован: 18.12.2004 (Сб) 9:53
Откуда: г.Ярославль

Сообщение dr.MIG » 07.10.2007 (Вс) 16:58

Да я понял, только слишком поздно, что бы удалить сообщение -- на него уже ответили.

А вообще, Format(Format(Hex(x), "\0@"), "!@@") :wink:
Salus populi suprema lex

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

Сообщение Хакер » 07.10.2007 (Вс) 17:13

Ха :D
Т.е. ты считаешь, что Format(Format(Hex(x), "\0@"), "!@@") гораздо лучше, чем Right("0" + Hex(x), 2) ?


Проведём эксперимент :) . Одну рубашку мы постираем обычным порошком:
0,09375
0,09375
0,09375
0,09375
А вторую, порошком от доктора МИГ-а
0,25
0,25
0,25
0,25

(Стирка производилась 100000 раз)
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

dr.MIG
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1441
Зарегистрирован: 18.12.2004 (Сб) 9:53
Откуда: г.Ярославль

Сообщение dr.MIG » 07.10.2007 (Вс) 17:58

Не, боже упаси, я такого никогда не говорил.
Просто
Хакер писал(а):Как ты собрался использовать формат?


Я написал первый свой вариант, не приняв во внимание, что Hex(10) в качестве выражения в Format'е будет восприниматься как строка. Поэтому, чтобы функция работала (не отказываться же от своих слов, что это можно сделать форматом :)) я внёс некоторые коррективы и так получился второй вариант, работающий со строками.
В данном случае, естественно, вариант с Right лучше.
Salus populi suprema lex

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Сообщение iGrok » 07.10.2007 (Вс) 19:11

bvv70 писал(а):Спасибо Хакеру, код прекрасно действует: из
D:\Библиотека TXT\Зарубежные авторы\А\АБНЕТТ Дэн\Рейвенор\01_Рейвенор.txt
получается:
file://D:\Библиотека%20TXT\Зарубежные%20авторы\А\АБНЕТТ%20Дэн\Рейвенор\01_Рейвенор.txt
что отлично понимается браузером. Получается что заменить можно было только пробел?
Ну вообще-то в этом случае да. )
А так - пробел + еще какие-то символы.. Не помню уже. Но лучше все же не менять вручную, а пользоваться вариантом Хакера.

Второй обсуждаемый способ обсуждается уже ради самого обсуждения ,-)
label:
cli
jmp label

Lumen
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 841
Зарегистрирован: 03.12.2005 (Сб) 16:09
Откуда: Брянск

Сообщение Lumen » 11.10.2007 (Чт) 0:39

Народ, а как преобразовать кодированный url обратно в нормальную ссылку. То есть как работает функция URLDecode в PHP? То есть как из строки: "%CA%F2%EE+%F2%E0%EA%EE%E9+Lumen" получить обратно "Кто такой Lumen"?
Подпись проходит рефакторинг

Lumen
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 841
Зарегистрирован: 03.12.2005 (Сб) 16:09
Откуда: Брянск

Сообщение Lumen » 11.10.2007 (Чт) 2:27

Вроде сделал. Вот мой вариант:
Код: Выделить всё
Function UrlDecode(url As String) As String
Dim pos As Long, char As String
pos = 1
url = Replace(url, "+", " ")
Do
    pos = InStr(url, "%")
    If pos = 0 Then Exit Do
    char = Mid(url, pos + 1, 2)
    url = Replace(url, "%" + char, Chr(CLng("&H" + char)), 1, 1)
Loop
UrlDecode = url
End Function

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

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 11.10.2007 (Чт) 7:42

Народ, а вы справку читали?
У InternetCanonicalizeUrl есть флаг ICU_DECODE.
Lasciate ogni speranza, voi ch'entrate.

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

Сообщение Хакер » 11.10.2007 (Чт) 13:45

Код: Выделить всё
Private Declare Sub InternetCanonicalizeUrl Lib "wininet.dll" Alias "InternetCanonicalizeUrlA" (ByVal lpszBaseUrl As String, ByVal ret As Long, ByRef lpdwBufferLength As Long, ByVal dwFlags As Long)
Private Const ICU_DECODE = &H10000000
Private Const ICU_NO_ENCODE = &H20000000
Private Sub Form_Load()
    Dim strBuffer As String
    strBuffer = String(255, 0)
    Dim url As String
   
   
    '{
        url = "Привет, Lumen!"
        InternetCanonicalizeUrl url, StrPtr(strBuffer), 255, 0
    '}
   
    '{
        url = StrConv(strBuffer, vbUnicode)
        InternetCanonicalizeUrl url, StrPtr(strBuffer), 255, ICU_DECODE Or ICU_NO_ENCODE
    '}
   
    MsgBox StrConv(strBuffer, vbUnicode)
End Sub
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.


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

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

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

    TopList