Записать шестнадцатеричную строку в файл в двоичном режиме - PullRequest
0 голосов
/ 13 февраля 2019

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

Мой текущий код такой:

Sub Write2Binary()
Dim i As Integer
Dim nFileNum As Integer
Dim sFilename As String

sFilename = "D:\OutputPath\Test.bin"

strBytes = "F3 A1 02 00 04 00 8D 24 44 C3 8C 03 83 49 26 92 B5"
arrBytes = Split(strBytes)

nFileNum = FreeFile

Open sFilename For Binary Lock Read Write As #nFileNum

For i = LBound(arrBytes) To UBound(arrBytes)
    Put #nFileNum, , arrBytes(i)
Next i

Close #nFileNum

End Sub

Этот кодсоздает следующий двоичный файл, который при открытии в шестнадцатеричном редакторе выглядит следующим образом:

08 00 02 00 46 33 08 00 02 00 41 31 08 00 02 00 
30 32 08 00 02 00 30 30 08 00 02 00 30 34 08 00 
02 00 30 30 08 00 02 00 38 44 08 00 02 00 32 34 
08 00 02 00 34 34 08 00 02 00 43 33 08 00 02 00 
38 43 08 00 02 00 30 33 08 00 02 00 38 33 08 00 
02 00 34 39 08 00 02 00 32 36 08 00 02 00 39 32 
08 00 02 00 42 35 

Это отличается от содержимого, которое я хочу иметь в двоичном файле.Когда я открываю файл в редакторе Hex, мне нравится видеть следующее содержимое:

F3 A1 02 00 04 00 8D 24 44 C3 8C 03 83 49 26 92 B5

Как я могу это сделать?

1 Ответ

0 голосов
/ 13 февраля 2019

Ваши данные представляют собой шестнадцатеричные значения байтов, которые будут записаны в двоичный файл.Split создает массив строк, каждый элемент является строковым представлением шестнадцатеричного значения.Как сказал вам Коминтерн, вам нужно преобразовать их в числа.

Put использует тип параметра Varname для определения длины (количества байтов) записи, поэтому в этом случае вам нужнопреобразовать в Byte, поэтому используйте CByte для преобразования.CByte также необходимо знать, что значения являются шестнадцатеричными, поэтому добавьте &H

Все, ваш код становится

Sub Write2Binary()
    Dim i As Long
    Dim nFileNum As Integer
    Dim sFilename As String
    Dim strBytes As String
    Dim arrBytes As Variant

    sFilename = "D:\OutputPath\Test.bin"

    strBytes = "F3 A1 02 00 04 00 8D 24 44 C3 8C 03 83 49 26 92 B5"
    arrBytes = Split(strBytes)

    nFileNum = FreeFile

    Open sFilename For Binary Lock Read Write As #nFileNum

    For i = LBound(arrBytes) To UBound(arrBytes)
        Put #nFileNum, , CByte("&H" & arrBytes(i))
    Next i

    Close #nFileNum
End Sub
...