Тема: AHK: Как читать нетекстовые файлы?
Не могу прочитать даже маленький файл *.bmp
Применил простые
FileRead, var, C:\1.bmp
FileAppend, %var%, C:\1.txtВ txt попадает только первая часть "BMv".
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Не могу прочитать даже маленький файл *.bmp
Применил простые
FileRead, var, C:\1.bmp
FileAppend, %var%, C:\1.txtВ txt попадает только первая часть "BMv".
Есть объект File и его метод RawRead.
file := FileOpen("C:\1.bmp", "r")
ret := file.RawRead(buf, file.length)
file.Close()
MsgBox, Прочитано %ret% байт
Кстати, поправьте заголовок темы (префикс), пока модератор не заругался.
Спасибо! Попробую.
А куда собственно само прочитанное помещается? В переменную "buf"? Что-то у меня в ней не то...
Да, в неё. А как вы определили, что не то?
Я открывал перед этим bmp с помощью Notepad++ и ожидал увидеть при чтении скриптом что-то аналогично. И мне сложно представить, что содержимое bmp-файла 10x10 пикселей поместилось в два символа.
Смотреть этот буфер как текст бесполезно, т.к. там содержатся нулевые байты, которые в тексте обозначают конец строки. Сохраните этот буфер в другой файл методом RawWrite и потом сравните исходный файл и эту копию.
file := FileOpen("C:\1.bmp", "r")
ret := file.RawRead(buf, file.length)
file.Close()
file := FileOpen("C:\2.bmp", "w")
file.RawWrite(buf, ret)
file.Close()
Да, работает.
Но как мне редактировать таким образом прочитанный файл? Я ожидал увидеть информацию в таком же виде, как и в обычных текстовых файлах и определённым образом её редактировать.
Бинарные файлы редактируют в хекс-редакторах. Т.е. значения байтов переводятся в 16-ричные числа и в таком виде показываются. При сохранении изменений — обратный перевод. Вы можете так же попробовать. Хекс-представление — это уже строка, текст.
Хекс-представление — это уже строка, текст.
А как же её получить из bmp, avi, и т.п. средствами AHK?
Например, такой функцией. Вывести 32 байта группами по 4.
file := FileOpen("c:\1.bmp", "r")
ret := file.RawRead(buf, file.length)
file.Close()
hex := bin2hex(buf, 32, 4)
MsgBox, %hex%
bin2hex(ByRef buf, bytes, group = 0)
{
tmp := A_FormatInteger
SetFormat, Integer, Hex
Loop, %bytes%
{
hex .= SubStr("0" . SubStr(NumGet(buf, A_Index - 1, "UChar"), 3), -1)
If (group > 0) && !Mod(A_Index, group)
hex .= " "
}
SetFormat, Integer, %tmp%
Return hex
}
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться