Описание функции
BinaryHex
Преобразует строку шестнадцатеричных данных в бинарную, возвращая указатель. Когда буфер больше не нужен, он должен быть освобожден с помощью функции FreeMemory().
*Buffer = BinaryHex(String$)
Параметры
String$ | Строка для преобразования |
Возвращаемое значение
Успех: | Возвращает указатель на бинарные данные |
Ошибка: | Возвращает 0, если не удалось получить указатель. |
Примечания
Строка должна иметь в длину чётное число символов в диапазоне 0-9 и A-F, иначе будет возвращён 0.Пример
EnableExplicit
Procedure BinaryHex(String$)
Protected *m, *r.Ascii, *c.Character
Protected tmp.s{3}
Protected Size
If Not Asc(String$) ; пустая строка
ProcedureReturn 0
EndIf
Size = Len(String$)
If Size & 1 ; нечётное число
ProcedureReturn 0
EndIf
*c = @String$
*m = AllocateMemory(Size / 2 + 2)
If *m
*r = *m
; 0-9 и A-F (только в верхнем регистре)
While (*c\c > 47 And *c\c < 58) Or (*c\c > 64 And *c\c < 71) ; Or (*c\c > 96 And *c\c < 103) ; a-f нижний регистр не берём во внимание
tmp = "$"
tmp + Chr(*c\c)
*c + 2
If *c\c
tmp + Chr(*c\c)
*r\a = Val(tmp)
*r + 1
*c + 2
Else ; повторная проверка чётности, нужна ли она
FreeMemory(*m)
ProcedureReturn 0
EndIf
Wend
; проверка дошли ли мы до конца строки, если не 0,
; то не дошли и в строке есть не шестнадцатеричные символы
If *c\c <> 0
ProcedureReturn 0
EndIf
If *r > *m
*r\a = 0
; Добавляем ещё 0, чтобы можно было использовать UTF8, UTF16
*r + 1
*r\a = 0
EndIf
EndIf
ProcedureReturn *m
EndProcedure
Define *s, *u
*s = BinaryHex("507572654261736963") ; Ascii (возвратит "PureBasic")
; *s = BinaryHex("500075007200650042006100730069006300") ; UTF8 (возвратит "PureBasic")
; *s = BinaryHex("1F0440043804320435044204") ; UTF8 (возвратит "Привет")
; в качестве ошибок можно было бы вывести отрицательные числа -1, -2, -3,
; чтобы сообщить пустая строка или неправильные символы или нечётность длины.
If *s
ShowMemoryViewer(*s, MemorySize(*s) - 1)
Debug PeekS(*s, -1, #PB_Ascii) ; Ascii
; Debug PeekS(*s) ; UTF8
FreeMemory(*s)
EndIf