Kodieren Sie Binärdateien unter Windows 2000+ mit integrierten Tools als Text

Kodieren Sie Binärdateien unter Windows 2000+ mit integrierten Tools als Text

Ich habe über Citrix Remotedesktopzugriff auf einen Remoteserver mit Windows 2000. Der Server hat keinerlei Internetzugang. Die einzige Möglichkeit, Daten zu übertragen, ist das Kopieren von Text über den Remotedesktop. Aus irgendeinem Grund funktioniert das Kopieren von Dateien nicht, nur von Text, aber immerhin bis zu 10 MB.

Gibt es integrierte Tools (in Windows 2000), mit denen ich eine Binärdatei in Text kodieren und dekodieren kann (Base64, uEncode, Hex, was auch immer ...)?

Antwort1

Ja,es gibt tatsächlich.

Von cmd.exe,

So kodieren Sie eine Datei:certutil -encode inputFileName encodedOutputFileName

So dekodieren Sie eine Datei:certutil -decode encodedInputFileName decodedOutputFileName

Antwort2

Hier ist ein JScript-basiertes Skript, das ich geschrieben habe und das eine Binärdatei in ihre hexadezimale Darstellung und umgekehrt übersetzen kann. Speichern Sie den Code als HexEncoder.jsoder was auch immer Sie wollen, solange er die .jsErweiterung hat.

// Original script written by paulkienitz, 20110301
// http://www.codeproject.com/Messages/3718403/a-shorter-and-quicker-way-modified.aspx

// Check the parameters count
if (WScript.Arguments.length < 3)
{
    WScript.Quit(2);
}

// Ensure the action parameter is long enough
if (WScript.Arguments(0).length < 2)
{
    WScript.Quit(3);
}

// Detect invalid characters
var action = WScript.Arguments(0).toUpperCase().charCodeAt(1);

switch (action)
{
    // 'D' or 'E'
    case 0x44:
    case 0x45:
        break;

    default:
        WScript.Quit(3);
        break;       
}

var fso = new ActiveXObject("Scripting.FileSystemObject");
var source = WScript.Arguments(1).replace("\\", "\\\\");

// Check whether the source file actually exists
if (!fso.FileExists(source))
{
    WScript.Quit(4);
}

var dest = WScript.Arguments(2).replace("\\", "\\\\");

// When we read a binary stream as ISO 8859-1 (Latin 1), we should get a
// string where each charCodeAt value matches the byte from the stream.
// Unfortunately Windows won't give you Latin 1 -- when you ask for it,
// you get code page 1252, which has extra characters stuck in for byte
// values from 128 to 159. These two strings allow us to translate between
// the bogus Windows characters and the original byte values.
var bogusWindows1252Chars =
    "\u20AC\u201A\u0192\u201E\u2026\u2020\u2021" +
    "\u02C6\u2030\u0160\u2039\u0152\u017D" +
    "\u2018\u2019\u201C\u201D\u2022\u2013\u2014" +
    "\u02DC\u2122\u0161\u203A\u0153\u017E\u0178";

// No translation is necessary for characters 0x81, 0x8D, 0x8F, 0x90, or 0x9D
var correctLatin1Chars =
    "\u0080\u0082\u0083\u0084\u0085\u0086\u0087" +
    "\u0088\u0089\u008A\u008B\u008C\u008E" +
    "\u0091\u0092\u0093\u0094\u0095\u0096\u0097" +
    "\u0098\u0099\u009A\u009B\u009C\u009E\u009F";
    
if (action == 0x44) // D
{
    decode(source, dest);
}
else if (action = 0x45) // E
{
    encode(source, dest);
}

// This turns a string read as codepage 1252 into a boxed string with a
// byteAt method.
function binaryString(str)
{
    // Always return an object with a .length
    var r = str ? new String(str) : new String();
    
    r.byteAt = function(index)
    {
        var value = this.charCodeAt(index);

        // Translate character back to originating Windows-1252 byte value
        if (value > 0xff)
        {
            var p = bogusWindows1252Chars.indexOf(this.charAt(index));
            value = correctLatin1Chars.charCodeAt(p);
        }

        // Convert the value to hexadecimal
        var hex = value.toString(16);

        return (hex.length == 2) ? hex : "0" + hex;
    };

    return r;
}
 
// Does reverse translation from bytes back to Windows-1252 characters.
function fromByte(hex)
{
    var c = String.fromCharCode(parseInt(hex, 16));
    var p = correctLatin1Chars.indexOf(c);
    return (p == -1) ? c : bogusWindows1252Chars.charAt(p);
}

function encode(source, dest)
{
    var stream = new ActiveXObject("ADODB.Stream");
    stream.Type = 2 // adTypeText
    stream.Charset = "iso-8859-1"; // actually Windows codepage 1252
    stream.Open();
    stream.LoadFromFile(source);

    var chunkSize = 4096;
    encodedFile = fso.OpenTextFile(dest, 2, true); // 2 = ForWriting
    
    while (!stream.EOS)
    {
        var s = binaryString(stream.ReadText(chunkSize));
        var tempArray = new Array();

        for (var i = 0; i < s.length; i++)
        {
            tempArray[i] = s.byteAt(i);
        }

    var hexString = tempArray.join("");

        if (hexString.length > 0)
        {
            encodedFile.Write(hexString);
        }
    }

    encodedFile.Close();
    stream.Close();    
}

function decode(source, dest)
{
    var chunkSize = 8192;
    var encodedFile = fso.OpenTextFile(source, 1); // 1 = ForReading
    var decodedFile = fso.OpenTextFile(dest, 2, true); // 2 = ForWriting
    
    while (!encodedFile.AtEndOfStream)
    {
        var hexString = encodedFile.Read(chunkSize);
        var tempArray = new Array();
        
        for (var i = 0; i < hexString.length; i += 2)
        {
            tempArray[i >> 1] = fromByte(hexString.substring(i, i + 2));
        }

        var s = tempArray.join("");

        if (s.length > 0)
        {
            decodedFile.Write(s);
        }
    }

    decodedFile.Close();
    encodedFile.Close();
}

Syntax

So kodieren Sie eine Binärdatei:

cscript /nologo /e:jscript HexEncoder.js /e "binary file" "output file"

So kehren Sie zurück:

cscript /nologo /e:jscript HexEncoder.js /d "encoded file" "binary file"

Beispielverwendung

Der folgende Befehl kodiert notepad.exeund speichert die Ausgabe auf dem Desktop:

cscript /nologo /e:jscript HexEncoder.js /e "%windir%\notepad.exe" "%userprofile%\Desktop\notepad.exe-hex.txt"

Bekannte Einschränkungen

  • Codierte Dateien sind doppelt so groß wie die Originaldateien.

  • Das Skript eignet sich am besten für kleine Dateien, etwa unter 1024 KiB.

    Sie können diese Einschränkungen möglicherweise umgehen, indem Sie mithilfe des obigen Skripts einen Encoder eines Drittanbieters übertragen.

verwandte Informationen