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

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

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

Сообщение AntonGV » 20.10.2008 (Пн) 20:53

Работаю с модемом с помощью AT команд. В ответ на USSD запрос (AT+CUSD=1,"*102#",15) приходит такая строка:
+CUSD: 2,"04110430043B0430043D044100200039002E0030003900200440002E002004220432043E0439002004420435043B04350444043E0...",72

Как-то ее на преобразовать в юникод. Каждые два символа - 1 байт (HEX)
Пробовал преобразовывать так:
Код: Выделить всё
  Dim t As String, i As Integer, a As Byte, o As String, b() As Byte
  t = "110430043B0430043D044100200039002E0030003900200440002E002004220432043E0439002004420435043B04350444043E043D002004430433043004340430043504420020043B044E0431043E04390020044504380442002E04170432043E043D04380020003000360036003500210020003300300440002F043C0438043D"
  ReDim b(Len(t) / 2)
  For i = 1 To Len(t) Step 2
    o = Mid(t, i, 2)
    a = Val("&h" + o)
    b((i - 1) / 2) = a
  Next i
  Text1 = b

но получается неправильно:
БаланA 9.09Р@.РТво9Ртелефо=РугадаеBРлюбо9РхиBЮЗвон8 0665! За@Ями=

Подскажите как правильно преобразовать в читабельный текст?
Если долго мучиться, что-нибудь получится

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

Re: Переобразование строки из HEX в нормальный вид

Сообщение alibek » 22.10.2008 (Ср) 8:09

Код: Выделить всё
Function Hex2Dump(ByVal HexString As String) As Byte()
  Dim buff() As Byte, I As Long, N As Long
  N = Len(HexString) / 2
  ReDim buff(0 To N - 1)
  For I = 0 To N - 1
    buff(I) = Val("&h" & Mid$(HexString, 1+2*I, 2))
  Next I
  Hex2Dump = buff
End Function


Если там действительно юникод, то затем StrConv.
Но мне думается, что на USSD-запрос приходит UTF.
Lasciate ogni speranza, voi ch'entrate.

AntonGV
Бывалый
Бывалый
 
Сообщения: 234
Зарегистрирован: 24.05.2006 (Ср) 12:10
Откуда: г. Пермь

Re: Переобразование строки из HEX в нормальный вид

Сообщение AntonGV » 22.10.2008 (Ср) 20:18

alibek, Тоже самое получается, что и у меня в первом посте :(
Строка получается только на половину читаемая. Если сравнивать то что приходит, и то что должно быть, то получается так:
приходит:       1104;3004;3B04;3004;3D04;4100;2000;3900;2E00;3000;3900;2004;4000;2E00;2004;2204;3204;3E04;3900;2004;4204...
должно быть: 1104;3004;3B04;3004;3D04;4104;2000;3900;2E00;3000;3900;2000;4004;2E00;2000;2204;3204;3E04;3904;2000;4204...
Везде есть "04"... Как это можно исправить? ведь эти "сбои" находятся в произвольных местах текста

Но мне думается, что на USSD-запрос приходит UTF.

Здесь пишут, что ответ приходит в юникоде.
Если долго мучиться, что-нибудь получится

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

Re: Переобразование строки из HEX в нормальный вид

Сообщение alibek » 23.10.2008 (Чт) 9:25

AntonGV писал(а):Здесь пишут, что ответ приходит в юникоде.

Наверняка ошибаются.
Lasciate ogni speranza, voi ch'entrate.

HiSER
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 88
Зарегистрирован: 04.07.2007 (Ср) 18:17

Re: Переобразование строки из HEX в нормальный вид

Сообщение HiSER » 23.10.2008 (Чт) 9:45

Ломал ломал голову пока не увидел что байты перевёрнуты :)
Код: Выделить всё
Private Sub Command1_Click()
MsgBox USSDConv("04110430043B0430043D044100200039002E0030003900200440002E002004220432043E0439002004420435043B04350444043E043D002004430433043004340430043504420020043B044E0431043E04390020044504380442002E04170432043E043D04380020003000360036003500210020003300300440002F043C0438043D")
End Sub

Private Function USSDConv(lpStr As String) As String
Dim i As Long
USSDConv = String$(Len(lpStr) \ 2, 0)
For i = 1 To Len(USSDConv) Step 2
Mid$(USSDConv, i, 1) = Chr$(CLng("&H" & Mid$(lpStr, i * 2 + 1, 2)))
Mid$(USSDConv, i + 1, 1) = Chr$(CLng("&H" & Mid$(lpStr, i * 2 - 1, 2)))
Next i
USSDConv = StrConv(USSDConv, vbFromUnicode)
End Function

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

Re: Переобразование строки из HEX в нормальный вид

Сообщение Хакер » 23.10.2008 (Чт) 15:05

Ужасный код :shock:

Вот код в два раза быстрее, чем твой, и действительно делающий конвертацию (а твой код потеряет все неASCII символы во время StrConv...).
Код: Выделить всё
Private Function USSDConv(lpStr As String) As String
    Dim i As Long
    USSDConv = String$(Len(lpStr) \ 4, 0)
    For i = 0 To Len(USSDConv) - 1
        Mid$(USSDConv, i + 1, 1) = ChrW$(CLng("&H" & Mid$(lpStr, i * 4 + 1, 4)))
    Next i
End Function



Можно убыстрить ещё в нескольк раз, отказавшись от двух Mid$, Chr, конкатенации с "&H" и превращения строки в число, заюзав байтовые массивы и обычную математику.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

AntonGV
Бывалый
Бывалый
 
Сообщения: 234
Зарегистрирован: 24.05.2006 (Ср) 12:10
Откуда: г. Пермь

Re: Переобразование строки из HEX в нормальный вид

Сообщение AntonGV » 23.10.2008 (Чт) 16:56

Большое спасибо, все работает :)
Если долго мучиться, что-нибудь получится


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

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

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

    TopList