1 (изменено: DnsIs, 2013-07-23 14:19:51)

Тема: JScript Шестнадцатеричное представление файла

Как продолжение темы

if (WScript.FullName.toLowerCase().indexOf("cscript.exe") < 0) {
    var wsh = WScript.CreateObject("WScript.Shell");
    wsh.Run ("CScript.exe " + "\"" + WScript.ScriptFullName + "\"");
    WScript.Quit();
}
eh = function (t) {WScript.Echo(t)}
stream = new ActiveXObject("ADODB.stream");

FILE_TO_READ = 'bin.dat';

//=========================== Копипаст от сих

stream.Type = 2;
stream.Charset = 'ISO-8859-1'; // Если эту строку удалить, то будет неправильный результат. Почему?
stream.Open();
stream.LoadFromFile(FILE_TO_READ);
stream.Position = 0;
stream.Charset = 'ascii';
stream.Position = this.position;
s1 = stream.ReadText();
stream.Position = 0;
stream.Charset = 'iso-8859-1';
stream.Position = this.position;
s2 = stream.ReadText();
stream.Close();
//=========================== До сих
cap = "Offset (h)\t";
for (i = 0; i < 16; i++) {
    cap += ("0" + i.toString(16)).slice(-2).toUpperCase() + " ";
    if (i == 7) cap += "  ";
}
eh (cap)
str = ""
for(var i = 0; i < s1.length; i++){
    if ((i == 0) || !(i % 16)) {
        eh (str);
        str = " " + ("0000000" + (i).toString(16)).slice(-8).toUpperCase()+ ":\t"
    }
    str += ('0'+(s1.charCodeAt(i)|(s2.charCodeAt(i)<0x80?0:0x80)).toString(16)).slice(-2).toUpperCase() + " ";
    if ((i != 0) && !((i+1) % 8)) {str += "  "}
}
WScript.StdIn.Read(1);
WScript.Quit()

Выводит файл из переменной FILE_TO_READ в шестнадцатеричном виде в консоль.

Прошу раскритиковать в пух и прах.
Кусок кода, который нашел в просторах интернета (помечен в комментариях скрипта), мне не до конца понятен.
Тому кто сможет вкратце рассказать, почему он делает то, что делает заранее большущее спасибо.
Например строка "stream.Charset = 'ISO-8859-1'" вообще непонятно для чего нужна.

Нас невозможно сбить с пути, нам пофигу куда идти.

2 (изменено: DnsIs, 2013-07-23 17:44:53)

Re: JScript Шестнадцатеричное представление файла

* Не выводилась последняя строка, исправил
+ Добавил вывод исходных данных

if (WScript.FullName.toLowerCase().indexOf("cscript.exe") < 0) {
    var wsh = WScript.CreateObject("WScript.Shell");
    wsh.Run ("CScript.exe " + "\"" + WScript.ScriptFullName + "\"");
    WScript.Quit();
}
eh = function (t) {WScript.Echo(t)}
stream = new ActiveXObject("ADODB.stream");

String.prototype.times = function(count){
    for(var i=0,result=''; i<count; i++) result += this;
    return result;
}

FILE_TO_READ = 'bin.dat';

//========== Скопипастил от сих
stream.Type = 2;
stream.Charset = 'ISO-8859-1'; // Если эту строку удалить, то будет неправильный результат. Почему?
stream.Open();
stream.LoadFromFile(FILE_TO_READ);
stream.Position = 0;
stream.Charset = 'ascii';
s1 = stream.ReadText();
stream.Position = 0;
stream.Charset = 'iso-8859-1';
s2 = stream.ReadText();
stream.Close();
//========== До сих
cap = "Offset (h) ";
for (i = 0; i < 16; i++) {
    cap += ("0" + i.toString(16)).slice(-2).toUpperCase() + " ";
    if (i == 7) cap += "  ";
}
eh (cap)
str = raw = "";
for(var i = 0; i < s1.length; i++){
    if ((i == 0) || !(i % 16)) {
        eh (str + raw);
        str = ("0000000" + (i).toString(16)).slice(-8).toUpperCase()+ ":  ";
        raw = ""
    }
    raw += s2.charAt(i).toString();
    str += ('0'+(s1.charCodeAt(i)|(s2.charCodeAt(i)<0x80?0:0x80)).toString(16)).slice(-2).toUpperCase() + " ";
    if ((i != 0) && !((i+1) % 8)) {str += "  "}
}
eh (str + " ".times(63 - str.length) + raw)
WScript.StdIn.Read(1);
WScript.Quit()
Нас невозможно сбить с пути, нам пофигу куда идти.

3

Re: JScript Шестнадцатеричное представление файла

По умолчанию кодировка Stream — Unicode, поэтому в начало добавляются байты FF FE. Других различий я не заметил.

4

Re: JScript Шестнадцатеричное представление файла

Странно, мне казалось, что кодировка задается непосредственно перед чтением:


stream.Charset = 'ascii';
s1 = stream.ReadText();
...
stream.Charset = 'iso-8859-1';
s2 = stream.ReadText();

Разве нет?

Нас невозможно сбить с пути, нам пофигу куда идти.

5 (изменено: YMP, 2013-07-23 18:20:04)

Re: JScript Шестнадцатеричное представление файла

Судя по всему, при чтении файла указание кодировки определяет только, будет ли в начало буфера поставлен BOM. С самим файлом ничего не делается. Перекодирование происходит, когда вы читаете из Stream в строку или пишете из строки в Stream. Строки в JScript кодируются в UTF-16. Если кодировка Stream указана иная, то при чтении и записи будет перекодирование.

Кодировка "ascii" семибитная, т.е. из каждого байта берутся младшие 7 битов. Строка s2, считанная как iso-8859-1, используется для того, чтобы определить, в какие из этих байтов нужно добавить 8-й бит. Это те, которые по iso-8859-1 сконвертировались в Юникод с кодом больше 127. Если бы это была настоящая iso-8859-1, то такие ухищрения были бы не нужны, т.к. у неё коды символов совпадают с первыми 256 кодами Юникода. Так что её конвертация в Юникод — это просто добавка нулевого байта, а числовое значение кода остаётся тем же. Но фактически при указании iso-8859-1 используется windows-1252, а у неё часть кодов из верхней половины таблицы конвертируется в Юникод за пределами первых 256. Так что значение кода символа в строке уже не всегда совпадает со значением байта в файле. Поэтому и нужен трюк с ascii.

6

Re: JScript Шестнадцатеричное представление файла

Сидел сегодня на работе, вспомнил про тему, накидал:

echo = function(t) {
    WScript.Echo(t)
}

quit = function() {
    WScript.Quit()
}

openFile = function () {
    var fop = new ActiveXObject( "UserAccounts.CommonDialog" );
    var OFN_NON                 =    0;
        OFN_READONLY            =    1;
        OFN_HIDEREADONLY        =    4;
        OFN_ALLOWMULTISELECT    =  512;
        OFN_FILEMUSTEXIST       = 4096;
    fop.InitialDir = "C:\\";
    fop.Filter = "Все файлы|*.*";
    fop.FilterIndex = 2;
    fop.Flags = OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;
    var rtn = fop.ShowOpen();
    return (fop.FileName || false)
}

help = function () {
    str = "DUMP.JS v0.1\n\n"
    str += "        Usage :: DUMP.JS source [destination]\n\n";
    str += "        source :: Source file (drive:\\path\\name or name)\n";
    str += " destination :: Destination file (drive:\\path\\name or name)\n";
    str += "                        If not specified, will be stored in\n";
    str += "                        a directory for the source file\n";
    str += "                        with the prefix '.hex'\n";
    echo (str);
    quit();
}

String.prototype.times = function(count){
  for(i = 0, result = "" ; i < count; i++) result += this;
  return result;
}

var stream = new ActiveXObject("ADODB.stream"),
    fso = new ActiveXObject("Scripting.FileSystemObject"),
    DIR = WScript.ScriptFullName.replace(/(.*)\\.*/, "$1") + "\\",
    arg = WScript.Arguments,
    LEN = arg.length,
    ARGUMENTS = "";
    BYTES = 1024 * 1024 * 1;
    INDEX = POSITION = 0,
    S = [],
    R = [],
    RAW = "";
    SYMBOLS = ".".times(32) + 
        " !\"#$%&'()*+,-./0123456789:;<=>?" +
        "@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_" +
        "`abcdefghijklmnopqrstuvwxyz{|}~." +
        "ЂЃ‚ѓ„…†‡€‰Љ‹ЊЌЋЏђ‘’“”•–—.™љ›њќћџ" +
        " ЎўЈ¤Ґ¦§Ё©Є«¬®Ї°±Ііґµ¶·ё№є»јЅѕї" +
        "АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ" +
        "абвгдежзийклмнопрстуфхцчшщъыьэюя";

if (LEN) {
    arg.Item(0).match(/[\/-]\?|h|help/) ? help() : false;
    FILE_TO_READ = arg.Item(0);
    if (LEN == 2) {
        FILE_TO_SAVE = arg.Item(1);
    } else {
        FILE_TO_SAVE = FILE_TO_READ + ".hex" ;
    }
} else {
    FILE_TO_READ = openFile();
    if (FILE_TO_READ) {
        FILE_TO_SAVE = FILE_TO_READ + ".hex" ;
    } else {
        quit()
    }
}

if (FILE_TO_READ.match(/^\S:\\/)) {
    DIR = FILE_TO_READ.replace(/(.*\\).*$/,"$1")
} else {
    FILE_TO_READ = DIR + FILE_TO_READ
}

if (!FILE_TO_SAVE.match(/^\S:\\/)) {
    FILE_TO_SAVE = DIR + FILE_TO_SAVE
}

if (!fso.fileExists(FILE_TO_READ)) {
    echo ("The file " + FILE_TO_READ + " not found.\n");
    quit();
}

SIZE = fso.GetFile(FILE_TO_READ).size;

if (fso.fileExists(FILE_TO_SAVE)) {
    echo ("The file " + FILE_TO_SAVE + " already exists.\nWill not be recorded.\n");
    quit();
} else {
    try {
        file = fso.CreateTextFile(FILE_TO_SAVE);
    } catch(e) {
        echo ("Can not create file " + FILE_TO_SAVE, 1);
        quit();
    }
}


str = "Offset (h) 00 01 02 03 04 05 06 07   08 09 0A 0B 0C 0D 0E 0F";
file.WriteLine(str)

for (b = 0; b < SIZE; b += BYTES) {
    stream = new ActiveXObject("ADODB.stream");
    stream.Type = 2;
    stream.Charset = 'ISO-8859-1';
    stream.Open();
    stream.LoadFromFile(FILE_TO_READ);
    stream.Position = 0;
    stream.Charset = 'ascii';
    stream.Position = POSITION + BYTES * b;
    s1 = stream.ReadText(BYTES);
    stream.Position = 0;
    stream.Charset = 'iso-8859-1';
    stream.Position = POSITION + BYTES * b;
    s2 = stream.ReadText(BYTES);
    stream.Close();
    str = ""; s = r = "";
    len = s1.length;
    for (i = 0; i < len; i++) {
        SYM = (s1.charCodeAt(i) | (s2.charCodeAt(i) < 0x80 ? 0 : 0x80));
        S[i] = SYM.toString(16).slice(-2).toUpperCase();
        R[i] = SYMBOLS.charAt(SYM.toString(10));
    }

    while (S.length != 0) {
        str += ("0000000" + (INDEX).toString(16)).slice(-8).toUpperCase() + ":  ";
        INDEX += 16;
        for (i = 0; (i < 16) && (S.length != 0); i++) {
            SYM = ("0" + S.shift()).slice(-2)
            str += ((i == 8) ? "  " + SYM : SYM) + " ";
            RAW += R.shift();
        }
        str += " ".times(51 - RAW.length * 3) + RAW + "\n";
        RAW = "";
    }
    R = []; S = [];
    file.WriteLine(str)
}
echo("Ok");
quit()

Скрипт делает дамп файла в HEX представлении. Но работает преочень долго. Можно как-нибудь ускорить?

Нас невозможно сбить с пути, нам пофигу куда идти.

7

Re: JScript Шестнадцатеричное представление файла

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

Нас невозможно сбить с пути, нам пофигу куда идти.

8

Re: JScript Шестнадцатеричное представление файла

od

Есть во всех unix-портах под винду.

( 2 * b ) || ! ( 2 * b )

9

Re: JScript Шестнадцатеричное представление файла

list.exe из набора Debugging Tools умеет выводить содержимое файла в hex'е. Какбы, есть hiew - там и функционал побогаче, с функционалом победнее - biew. На худой конец можно дампить PoSh'ем (см. здесь).
od это конечно круто, но лично мне никогда не нравились порты. Да и вообще кесарю - кесарево, ОСи - ОСевое и дыр и пыр.

10 (изменено: yandibaev, 2023-03-04 02:44:21)

Re: JScript Шестнадцатеричное представление файла

Можно и ускорить
HexToFile

Garric

11

Re: JScript Шестнадцатеричное представление файла

yandibaev, ознакомьтесь, пожалуйста, с Правилами, отредактируйте свои посты. Обратите внимание на оформление кода и ссылок, и на точки в конце предложений.
Кроме того, поднимать посты многолетней давности — не лучшая идея. Хотите поделиться кодом — создайте новую тему.

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

12 (изменено: yandibaev, 2023-03-04 02:55:58)

Re: JScript Шестнадцатеричное представление файла

Удалите мой профиль. Не хочу с вами больше иметь дел.
Хотел ссылку на потоковую функцию Hex to File дать. Вы удалили.

Garric

13

Re: JScript Шестнадцатеричное представление файла

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

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

14

Re: JScript Шестнадцатеричное представление файла

yandibaev пишет:

Можно и ускорить
HexToFile

Уже лучше, ссылка оформлена правильно, но точка так и не появилась. Кроме того, в другом вашем посте неплохо бы добавить оформление кода.

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

15 (изменено: Xameleon, 2023-03-06 13:17:34)

Re: JScript Шестнадцатеричное представление файла

DnsIs, приветствую ! ).

DnsIs пишет:

Скрипт делает дамп файла в HEX представлении. Но работает преочень долго. Можно как-нибудь ускорить?

.

Как вариант, можно использовать встроенную в Windows утилиту certutil.

Позволяет конвертить в hex / base64.

Ссылки по теме:
1) https://www.dostips.com/forum/viewtopic.php?t=8521 (инфа по ограничениям и примеры)
2) https://learn.microsoft.com/ru-ru/windo … s/certutil
3) https://learn.microsoft.com/ru-ru/windo … dfrom=MSDN

Пример вызова:


certutil -encodehex "file.txt" "file.hex" 12
Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !