Что нового

Данные, строки Как AutoIt хранит бинарные данные?

Oki

Продвинутый
Сообщения
452
Репутация
63
Как AutoIt хранит то, что в справке называется бинарными данными? Надеюсь, что доступна не лишь строка, начинающаяся с символов нуля и строчного икса, и что просто функции, работающие с бинарными данными, на ходу кастят их в длинный текст вида "0x..."?

Мне кажется, что привычным чтением бинарных данных из файла является получение массива байт, а привычной записью бинарных данных в файл является запись из массива байт, но такой подход не виден в лежащих на виду примерах. Правда, насколько я понимаю, в AutoIt в принципе не предусмотрен тип данных, аналогичный типу Byte во многих других языках. Неужели каждый раз нужно идти окольными путями, совершая на ходу дополнительные обработки данных далёким от естественного способом?
 
Последнее редактирование:

InnI

AutoIT Гуру
Сообщения
4,950
Репутация
1,444
привычным чтением бинарных данных из файла является получение массива байт
С чего бы? Файл читается в непрерывную область памяти. А чтобы преобразовать эту область в массив байт - пишут соответствующие функции/методы.

в AutoIt в принципе не предусмотрен тип данных, аналогичный типу Byte во многих других языках.
Есть такой тип. Используется в структурах
Код:
$t = DllStructCreate("byte b")
DllStructSetData($t, "b", 0xFFFE)
ConsoleWrite(@error & @CRLF) ; заметьте, ошибки нет,
; хотя мы пытаемся записать два байта
ConsoleWrite($t.b & @CRLF) ; 254 так как AutoIt
; по умолчанию выводит в десятичном представлении


Как AutoIt хранит то, что в справке называется бинарными данными?
Код:
$s = "abc" ; это строка, то есть СИМВОЛЫ

$b = Binary($s) ; это бинарное представление строки, то есть КОДЫ символов

ConsoleWrite($b & @CRLF) ; 0x616263 это отображение кодов
; то есть AutoIt знает, что в переменной $b находятся бинарные данные,
; которые не нужно конвертировать в символы при выводе

$b2s = BinaryToString($b) ; это конвертация кодов в символы
ConsoleWrite($b2s & @CRLF) ; abc это снова строка

$b2s = BinaryToString(0x616263) ; это тоже конвертация кодов в символы
ConsoleWrite($b2s) ; сba теперь это строка
; обратите внимание, что символы идут наоборот,
; то есть в переменной байты разворачиваются,
; потому что мы передали число, а не бинарные данные
ConsoleWrite(@CRLF)

$b2s = BinaryToString(Binary("0x616263")) ; а здесь мы передаём именно
; бинарные данные, то есть нужную нам последовательность байт
ConsoleWrite($b2s) ; abc теперь это "правильная" строка
ConsoleWrite(@CRLF)
 
  • Like
Реакции: Oki
Автор
Oki

Oki

Продвинутый
Сообщения
452
Репутация
63
Я понимаю, что обычно тем, кому нужен скриптовой язык, полезнее работать с конвертированными данными, а не с кодами. Но у меня возникает нередко потребность работы именно с ASCII-кодами. Для меня привычно читать из файла данные в массив байт и сохранять в файл данные из массива байт. В последнее время смотрю в сторону функций BinaryLen() и BinaryMid(), а то вырезание из конвертированного текста с последующей интерпретацией (а также обратная склейка типа текстов типа "0x77" + "0x77" = "0x7777") вообще выглядели извращением.

InnI, благодарю за прояснения.
 
Автор
Oki

Oki

Продвинутый
Сообщения
452
Репутация
63
Код:
$s = "abc"
$a = StringToASCIIArray($s)
Пожалуй, лучше воспользуюсь твоим же решением, только что опубликованным в параллельном топике, так как там не требуется ненужная конвертация бинарных данных в строку.
 

InnI

AutoIT Гуру
Сообщения
4,950
Репутация
1,444
Если файл текстовый, то нет смысла читать его в бинарном виде и обрабатывать в цикле для получения массива байт. Проще и быстрее прочитать, как текст, и применить StringToASCIIArray. При записи, соответственно, наоборот: StringFromASCIIArray
 
Верх