1

Тема: CMD/BAT: Вывод двоичных данных в файл

Здравствуйте, уважаемые знатоки BAT-технологии!
Прошу помочь разобраться с одним вопросом относительно BAT-файлов, который в интернете освещен совсем недостаточно, и найти полезные материалы по нему практически невозможно

Задача заключается в том, что необходимо с помощью BAT-приложения вывести в файл некоторый текст, который может содржать любые ASCII-символы, в том числе непечатаемые, но сам исходный код BAT-файла не должен содержать их
То есть нужно получить некоторое подибие функции print "\xAB" , где AB- это ASCII-КОД некоторого выводимого символа, а не его собственное включение

Можно придумать несколько вариатов решения, но перед тем как приступать к непосредственной реализации, хотелось узнать, возможно ли это, и насколько сложно, и реализуемо ли в разумными затратами времени
Важно отметить, что поставленная задача НЕ придумана просто так (От скуки :-), а является решением ряда других задач более высокого порядка; Это также ознаает, что для ее решения категорически нельзя использовать сторонние exe-файлы, кроме тех, что расположены в windows nt по умолчанию

1 вариант: С помощью цикла считать содержимое какого-либо гарантированно имеющегося двоичного файла, который гарантированно содержит все ASCII-символы от 0 до 255, и скопировать его собственный образ в переменную окружения
Такой вариант решения должен дать гарантированное решение задачи, но является крайне сложным; Действительно, во-первых необходимо получить ASCII-коды считываемых символов, это можно сделать через hexdumper, но уже достаточно проблематично
К тому же, в таком случае требуется получить двоичный файл, содержащий все возможные ASCII-символы, а это нетривиальная задача, да и к тому же противоречивая: чтобы быть уверенным в наличии всех символов, файл должен быть огромным, но тогда программа будет работать невозможно медленно

2 вариант: Можно решить оригинальную задачу несколько другим путем, в таком случае задача несколько переформулируется: Нужно иметь возможность удалить некоторые байты в заданном двоичном файле
Необходимы учитывать, что требуется именно удаление байтов, со смещением содержимого всего оставшегося файла, а не из замена к примеру нулевыми значениями
Если конкретизировать задачу, но удалить *всегда* требуется первые два байта, которые равны одной и той же конснанте - маркеру обрятного порядка байт в UCS-2, то есть комбинации 0xFE 0xFF

3 вариант: Можно целиком построить требуемый двоичный файл на основе предложенного на форуме решения, основанного на debug.exe; Такой вариает являлся бы допустимым, если размер целевого файла не был ограничен небольшим значением
На практике требуется построение произвольного двоичного файла, имеющего размер порядка 10kb - 3Mb

Заранее спасибо!

2

Re: CMD/BAT: Вывод двоичных данных в файл

нативе тулз & технолоджис говорите?

Цена вопроса? (-

3

Re: CMD/BAT: Вывод двоичных данных в файл

Спасибо за ответ, тем не менее видимо оригинальный вопрос был составлен мной неправильно, поскольку включал слишком много пунктов, и походил на просьбу о написании столь сложного приложения (Которое обойдется в копеечку :-)
Это не так, мне просто нужна консультация, без написания какого-либо программного кода в BAT-файле; хотя если есть ссылка на полезный материал, был бы благодарен

Итак формулирую вопросы крайне лаконично:
1 - Возможно ли в BAT-файле простым/очевидным образом осуществить вывод двоичной информации, которая в оригинальном BAT-файле указана в виде номеров этих байтов??
То есть на входе в функцию строка типа "\00\01\02", а на выходе сами эти байты

2 - Можно ли какими-либо средствами командной строки, например встроенным редактором edlin.exe, проводить удаление заданных байтов в файле

3 - На форуме здесь есть решение, позволяющее рптчить двоичные файлы http://forum.script-coding.com/viewtopic.php?id=2885; Вопрос к многоуважаемому автору, или тем кто хорошо ориентируется в этом решении - каков максимальный размер файла для патчинга?

Заранее спасибо

4

Re: CMD/BAT: Вывод двоичных данных в файл

debug.exe отсутствует в 64-битных системах. Используйте вспомогательный *.vbs файл.

5

Re: CMD/BAT: Вывод двоичных данных в файл

Александр_ пишет:

debug.exe отсутствует в 64-битных системах. Используйте вспомогательный *.vbs файл.

Спасибо за информацию! У меня нет 64-битной рабочей станции под рукой, и поэтому можно было бы сильно ошибиться, если пойти по такому пути
Использование сторонний VBS/JS-файл для решения задачи - в принципе не проблема, главное чтобы он отвечал все тем же поставленным требованиями,  и не содержал в своем исходоном коде непечатаемых символов

Благодаря поиску по несколько другим ключевым словам, мне удалось найти решение, очень близкое к требуемому; Многие HEX-символы он уже обрабатывает, останется написать только несколько отдельных условий для тех элементов, которые нужно предварять специальным знаком с точки зрения BAT-синтаксиса, и еще отдельное решение для NUL-символа

6

Re: CMD/BAT: Вывод двоичных данных в файл

Создайте *.bat файлом такой *.vbs файл и запустите:

str=""
for i=0 to 255
   str=str&chr(i)
next
Set fso=CreateObject("Scripting.FileSystemObject")
Set f = fso.OpenTextFile("C:\temp.txt",2,1,0)
f.Write str
f.Close
Wscript.Quit

появится файл C:\temp.txt, который содержит все символы от нулевого до 255-го включительно.

7 (изменено: BatLife, 2012-05-06 17:39:07)

Re: CMD/BAT: Вывод двоичных данных в файл

Александр_ пишет:

Создайте *.bat файлом такой *.vbs файл и запустите: <code>
появится файл C:\temp.txt, который содержит все символы от нулевого до 255-го включительно.

Идеально получилось, благодарю за помощь!

Самое интересное заключалось в том, что подобное решение было изготовлено уже много дней назад, но на языке WMI JS, но там раюота с объектом FileSystemObject->TextStream некорректна для двоичных файлов... Изначально предполагал, что VBS и JS будут работать идентично в этой ситации, но как выяснилось сейчас, VBS по-другому хранит строки в памяти, и поэтому функция работает нормально

Решение получилось следующим, при этом write_bytes_array - определяемый в JS-секции массив записываемых кодов байтов

Sub WriteBinFile
Set fso=CreateObject("Scripting.FileSystemObject")
Set f = fso.OpenTextFile("c:\file.bin",2,1,0)
out_by_str=""
For Each cv_out_bt in write_bytes_array
   out_by_str=out_by_str&chr(cv_out_bt)
next
f.Write out_by_str
f.Close
End Sub

8 (изменено: smaharbA, 2012-05-11 23:27:41)

Re: CMD/BAT: Вывод двоичных данных в файл

дайте мне файл содержащий что то кроме - "который гарантированно содержит все ASCII-символы от 0 до 255"

Вы не пан-директор случаем ?
уж очень это характерно
"на языке WMI JS, но там раюота с объектом FileSystemObject->TextStream некорректна для двоичных файлов... Изначально предполагал, что VBS и JS будут работать идентично в этой ситации, но как выяснилось сейчас, VBS по-другому хранит строки в памяти, и поэтому функция работает нормально"

Я конечно далек от мысли... (с)

9 (изменено: BatLife, 2012-05-12 13:41:38)

Re: CMD/BAT: Вывод двоичных данных в файл

smaharbA пишет:

Дайте мне файл содержащий что то кроме - "который гарантированно содержит все ASCII-символы от 0 до 255"

Дело в том, что рассматриваемая задача является достаточно неординарной, и с первого взгляда непонятно, что в ней нужно сделать, из-за чего она может показаться крайне простой
По Вашему конкретному вопросу могу сказать, что найти подобный файл, "который гарантированно содержит все ASCII-символы от 0 до 255", не так и просто... Понятное дело, что можно заранее заготовить специальный файл, содержимое которого будет представлять что-то типа "\x00\x01\x02 ....  \xFF", но это не соответствует условиям задачи!
Если взять крупный системный двоичный файл типа user32.dll, то скорее всего в нем будут вхождения каждого из ASCII-символов хотя бы по одному разу, но поиск будет очень долгим и не целесообразным
Собственно в силу указанной причины, такой метод бы расценен как крайне неэффективный, и поэтому убран из рассмотрения

smaharbA пишет:

На языке WMI JS, но там раюота с объектом FileSystemObject->TextStream некорректна для двоичных файлов... Изначально предполагал, что VBS и JS будут работать идентично в этой ситации, но как выяснилось сейчас, VBS по-другому хранит строки в памяти, и поэтому функция работает нормально

Выполните такой код на языке JS, и Вы поймете о чем шла речь

var fso=new ActiveXObject("Scripting.FileSystemObject")
var fl=fso.CreateTextFile("c:\\file.bin",true)
for(var i=128;i<256;i++)
{var cur_asciiz=String.fromCharCode(i)
fl.Write(cur_asciiz)
}

Несложно убедиться, что при выполнении подобного кода возникнет ошибка времени исполнения; Уже сейчас, после долгого разбора этого вопроса выяснилось, что проблема возникает из-за особенностей хранения строк в памяти в языке JS

Таким образом поставленная задача целиком и полностю решена, но возможно имеет смысл оставить эту тему, как напоминание о различии в методах хранения строковых значений в памяти в языках JS и VBS соответственно

P.S. Оригинальная статья - http://canegor.urc.ac.ru/gui_for_script … _file.html, обратить внимание на фразу

Если Вы попытаетесь с помощью приведенных выше фрагментов работать с бинарным файлом, то код "слетит" с ошибкой периода времени выполнения. Работать с содержимым двоичных файлов средствами объекта ActiveX с progID = Scripting.FileSystemObject невозможно

Как видно по текущей ветке на форуме, работать с содержимым двоичных файлов средствами объекта ActiveX с progID = Scripting.FileSystemObject все-таки возможно, но для этого нужно вынести функцию записи в файл на языка VBS, и передавать не строку JS, а массив ASCII-кодов байтов