1 (изменено: __Михаил__, 2021-02-22 03:15:08)

Тема: AHK: Raw - Чтение / Запись

Столкнулся с проблемой считывания содержимого из файлов.
С текстовыми файлами проблем нет, открыть / сохранить выходит.
Пытаюсь пересохранить .png файл - выходит пустой файл на выходе. При этом в Gui окошке есть текст, т.е. чтение происходит и проблема в самом методе сохранения в файл. Это видно в заголовке окна, 0 байт записано.
Ещё с текстом проблема, так как отображение нечитаемое, думаю нужно кодировать строки, но как правильно? Это всё же не основная проблема, главное сохранять .png файл.

#SingleInstance Force
#NoEnv
SetWorkingDir %A_ScriptDir%
SetBatchLines -1


FileName = 0.png
;0.png
;N1.ini
;Текст.txt
;Test.ahk



File := OpenRaw(FileName)			; Открыть.
R := SaveRaw(File.Buf,File.Ret, "SaveRaw-Test (" File.Code ").txt")	; Сохранить.

Gui Add, Edit, w360 h120, % File.Buf		; Показать содержимое.
Gui, Show,, % "Записано: " R " байт, кодировка: " File.Code
Return


OpenRaw(FileName)
{
 File := FileOpen(FileName, "r")
 File.Pos := 0		; Для текстовых файлов.
 Ret := File.RawRead(Buf, File.Length)
 File.Close()
 Return {"Buf":Buf, "Ret":Ret, "Code":File.Encoding}
}


SaveRaw(Buf, Length, FileName)
{
 File := FileOpen(FileName, "w")
 R := File.RawWrite(Buf, Length)
 File.Close()
 Return R
}


Esc::
F4:: ExitApp
F6:: Reload
Win10x64, AHK v1.1.37.01 (Unicode 64-bit) | AHK-Wiki | Переменные и выражения | RegEx101

2

Re: AHK: Raw - Чтение / Запись

Когда сохраняете буфер так:

{"Buf":Buf

он сохраняется, как строка, а там не строка, а бинарные данные.
Можно так:

FileName = test.png
Data := OpenRaw(FileName)
MsgBox, % SaveRaw(Data.GetAddress("Buf"), Data.Length, A_Desktop . "\test.png")

OpenRaw(FileName)
{
   File := FileOpen(FileName, "r")
   File.Pos := 0      ; Для текстовых файлов.
   len := File.Length
   Data := {}
   Data.SetCapacity("Buf", len)
   File.RawRead(Data.GetAddress("Buf"), File.Length)
   Data.Length := len, Data.Encoding := File.Encoding
   File.Close()
   Return Data
}


SaveRaw(pData, Length, FileName)
{
    File := FileOpen(FileName, "w")
    written := File.RawWrite(pData + 0, Length)
    File.Close()
    Return written
}

Но проще так:

FileName = test.png
len := OpenRaw(FileName, buff, encoding)
MsgBox, % SaveRaw(&buff, len, A_Desktop . "\test.png")

OpenRaw(FileName, ByRef buff, ByRef encoding)
{
   File := FileOpen(FileName, "r")
   File.Pos := 0      ; Для текстовых файлов.
   Return File.RawRead(buff, File.Length)
}


SaveRaw(pData, Length, FileName)
{
    Return FileOpen(FileName, "w").RawWrite(pData + 0, Length)
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

3

Re: AHK: Raw - Чтение / Запись

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

Win10x64, AHK v1.1.37.01 (Unicode 64-bit) | AHK-Wiki | Переменные и выражения | RegEx101

4 (изменено: teadrinker, 2021-02-22 03:40:16)

Re: AHK: Raw - Чтение / Запись

__Михаил__ пишет:

То что хранение в виде строк

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

MsgBox, % buff

AHK читает данные, находящиеся по адресу &buff, как строку в UTF-16 (в Unicode версии), поэтому в случае бинарных данных либо другой кодировки на выходе получаем кракозябры.

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