1

Тема: AHK: Запись байт в файл

Объясните, как грамотно записывать/дописывать байты в файл? Например, у меня есть: 0x03, 0x11, 0x0A, 0x09, 0x00, 0x00, 0x00, 0x00 и ещё 0x2102730000000000.

Пробовал разбирать примеры File.Write и File.RawWrite, но кажется это не подходит.
Нарисовал на картинке то, что в итоге должно получиться.

Post's attachments

Безымянный.png 2.92 kb, 1 downloads since 2018-04-19 

You don't have the permssions to download the attachments of this post.

2

Re: AHK: Запись байт в файл

У числа 0x2102730000000000 порядок байтов обратный тому, что нужен.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

3

Re: AHK: Запись байт в файл

Да, байты числа пишутся от младшего к старшему (справа налево).

4

Re: AHK: Запись байт в файл

https://autohotkey.com/docs/objects/File.htm#WriteNum

5

Re: AHK: Запись байт в файл

Методом тыка понял, как можно записывать в файлик по 2 байта:

data := 0xAB
File := FileOpen("Test.txt", "a")
File.WriteChar(data)
File.Close()

Ещё бы сохранить всю строку разом. На английском форуме попался пример от SKAN, в котором он "0x46464952" превращает в "RIFF".

VarSetCapacity( A, 4 )
NumPut( 0x46464952, A, "UInt" ) ; writing string 'RIFF' in reverse
MsgBox % StrGet( &A, "CP0" )

А как то же самое сделать в обратную сторону - ряд символов преобразовать в набор байт?

6

Re: AHK: Запись байт в файл

ypppu пишет:

Методом тыка понял, как можно записывать в файлик по 2 байта

0xAB — это не два байта, это один.

ypppu пишет:

А как то же самое сделать в обратную сторону - ряд символов преобразовать в набор байт?

Просто записать строку, она превратится в байты.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

7

Re: AHK: Запись байт в файл

Честно говоря, не понятно, какая задача решается. Хорошо бы поподробнее.

8

Re: AHK: Запись байт в файл

Я подготавливаю данные для ввода в программу. Отдельные байты могут меняться, но есть ряд байт, которые всегда одинаковые. В идеале все данные нужно подготавливать заранее, а потом сразу записать в файл. Я пока научился записывать байты по отдельности.

9

Re: AHK: Запись байт в файл

Т.е. вы пишете данные в файл, а программа потом их из файла читает? А подготовленные вами данные — это что? Хекс-строка вида 1B0CD422AF и т.д.? Если так, то их надо переписать в буфер памяти уже в виде байтов и потом этот буфер целиком записать в файл.

10

Re: AHK: Запись байт в файл

Вроде это и нужно. Вот, к примеру, у меня есть 0x03, 0x11, 0x0A, 0x09, 0x00, 0x00, 0x00, 0x00, плюс ещё 1B0CD422AF. Нужно чтобы это всё в таком же порядке записалось в файл. Что такое буфер памяти?

11

Re: AHK: Запись байт в файл

То, что VarSetCapacity создаёт. А 1B0CD422AF — это у вас число или просто последовательность байтов?

12

Re: AHK: Запись байт в файл

Спасибо, буду разбираться. 1B0CD422AF - это постоянная часть файла (последовательность байтов), её не требуется вычислять, просто записать в файл .

13

Re: AHK: Запись байт в файл

Своими силами не удалось разобраться, прошу помочь.
Имеется несколько байт, например:

a := 0x11
b := 0x22
c := 0x33
d := 0x77665544

Нужно объединить их в одну строку, а получившуюся строку записать в файл. В hex-редакторе должно отобразиться

11 . 22 . 33 . 44 . 55 . 66 . 77

+ открыть спойлер

http://cs301502.vk.me/v301502002/6b85/qfF5rs2ov2g.jpg

x := 0x46464952
VarSetCapacity(data, 4)
NumPut(x, data, str)

File := FileOpen("Test.txt", "w")
File.RawWrite(data, 4)
File.Close()

14 (изменено: teadrinker, 2018-04-27 19:23:50)

Re: AHK: Запись байт в файл

ypppu пишет:

Нужно объединить их в одну строку

Что ты понимаешь под строкой? Последовательность байтов не обязательно строка, это просто последовательность или массив байтов.

ypppu пишет:
NumPut(x, data, str)

В NumPut нет такого типа данных, как Str. Как следует из названия, эта функция поддерживает только числовые типы данных. В данном примере это Int или UInt. Кроме того, этот параметр является строчным значением, соответственно должен быть в кавычках.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

15

Re: AHK: Запись байт в файл

Строка - в смысле просто последовательность байтов. Отдельные байты или даже группы байтов известны заранее и хранятся в переменных, как я показал в предыдущем сообщении. Нужно содержимое этих переменных выстроить по порядку друг за дружкой внутри ещё одной переменной. После чего записать в файл содержимое этой переменной.

16

Re: AHK: Запись байт в файл


a := 0x11
b := 0x22
c := 0x33
d := 0x77665544
VarSetCapacity(data, 7)
NumPut(a, data, 0, "uchar"), NumPut(b, data, 1, "uchar"), NumPut(c, data, 2, "uchar")
NumPut(d, data, 3, "uint")
File := FileOpen("Test.txt", "w")
File.RawWrite(data, 7)
File.Close()

17

Re: AHK: Запись байт в файл

"Uchar" означает, что длина записи будет равна 1 байту, а "uint" - 4 байта, так? А как быть с длинной последовательностью байтов, например
d := 0x776655447766554477665544 ?

18

Re: AHK: Запись байт в файл

С такими числами AHK не работает, максимум:

Int64: A 64-bit integer, whose range is -9223372036854775808 (-0x8000000000000000) to 9223372036854775807 (0x7FFFFFFFFFFFFFFF).

Так что представлять такую последовательность байт в виде числа не имеет смысла.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

19

Re: AHK: Запись байт в файл

Хм, тогда придётся разбивать такую длинную последовательность на короткие, прежде чем представлять в виде числа, а после "склеивать". Либо хранить где-то бинарный файлик, потом читать из него в переменную, а дальше уже приклеивать к предыдущим байтам...

20

Re: AHK: Запись байт в файл

Всё правильно.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

21

Re: AHK: Запись байт в файл

ypppu пишет:

Хм, тогда придётся разбивать такую длинную последовательность на короткие, прежде чем представлять в виде числа, а после "склеивать".

Только разбивать лучше на однобайтные числа, иначе байты в каждом числе запишутся задом наперёд.