1 (изменено: Next, 2013-07-07 11:43:34)

Тема: AHK: Как читать нетекстовые файлы?

Не могу прочитать даже маленький файл *.bmp

Применил простые


FileRead, var, C:\1.bmp
FileAppend, %var%, C:\1.txt

В txt попадает только первая часть "BMv".

2 (изменено: YMP, 2013-07-07 06:44:43)

Re: AHK: Как читать нетекстовые файлы?

Есть объект File и его метод RawRead.


file := FileOpen("C:\1.bmp", "r")
ret := file.RawRead(buf, file.length)
file.Close()

MsgBox, Прочитано %ret% байт

Кстати, поправьте заголовок темы (префикс), пока модератор не заругался.

3

Re: AHK: Как читать нетекстовые файлы?

Спасибо! Попробую.

4 (изменено: Next, 2013-07-07 12:13:55)

Re: AHK: Как читать нетекстовые файлы?

А куда собственно само прочитанное помещается? В переменную "buf"? Что-то у меня в ней не то...

5

Re: AHK: Как читать нетекстовые файлы?

Да, в неё. А как вы определили, что не то?

6

Re: AHK: Как читать нетекстовые файлы?

Я открывал перед этим bmp с помощью Notepad++ и ожидал увидеть при чтении скриптом что-то аналогично. И мне сложно представить, что содержимое bmp-файла 10x10 пикселей поместилось в два символа.

7

Re: AHK: Как читать нетекстовые файлы?

Смотреть этот буфер как текст бесполезно, т.к. там содержатся нулевые байты, которые в тексте обозначают конец строки. Сохраните этот буфер в другой файл методом 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()

8

Re: AHK: Как читать нетекстовые файлы?

Да, работает.
Но как мне редактировать таким образом прочитанный файл?  Я ожидал увидеть информацию в таком же виде, как и в обычных текстовых файлах и определённым образом её редактировать.

9

Re: AHK: Как читать нетекстовые файлы?

Бинарные файлы редактируют в хекс-редакторах. Т.е. значения байтов переводятся в 16-ричные числа и в таком виде показываются. При сохранении изменений — обратный перевод. Вы можете так же попробовать. Хекс-представление — это уже строка, текст.

10

Re: AHK: Как читать нетекстовые файлы?

YMP пишет:

Хекс-представление — это уже строка, текст.

  А как же её получить из bmp, avi, и т.п. средствами AHK?

11 (изменено: YMP, 2013-07-07 17:27:49)

Re: 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
}