Описание функции


BinaryHex

Преобразует строку шестнадцатеричных данных в бинарную, возвращая указатель. Когда буфер больше не нужен, он должен быть освобожден с помощью функции FreeMemory().

*Buffer = BinaryHex(String$)

Параметры

String$ Строка для преобразования

Возвращаемое значение

Успех:Возвращает указатель на бинарные данные
Ошибка:Возвращает 0, если не удалось получить указатель.

Примечания

Строка должна иметь в длину чётное число символов в диапазоне 0-9 и A-F, иначе будет возвращён 0.
Используйте FreeMemory(), чтобы освободить созданный буфер в памяти.

Пример

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