Ja, das gibt es tatsächlich .
Von cmd.exe
So codieren Sie eine Datei: certutil -encode inputFileName encodedOutputFileName
So entschlüsseln Sie eine Datei: certutil -decode encodedInputFileName decodedOutputFileName
Ich habe einen Remotedesktopzugriff über Citrix auf einen Remoteserver unter Windows 2000. Der Server hat keinen Internetzugang. Die einzige Möglichkeit, Daten zu vermitteln, ist das Kopieren von Text über den Remote-Desktop. Aus irgendeinem Grund funktioniert das Kopieren von Dateien nicht, nur Text, aber mindestens 10 MB.
Gibt es integrierte Tools (in Windows 2000), mit denen ich eine binäre Datei in Text (Base64, uEncode, hex, irgendwas ...) codieren und decodieren kann?
Ja, das gibt es tatsächlich .
Von cmd.exe
So codieren Sie eine Datei: certutil -encode inputFileName encodedOutputFileName
So entschlüsseln Sie eine Datei: certutil -decode encodedInputFileName decodedOutputFileName
Hier ist ein JScript-basiertes Skript, das ich geschrieben habe und das eine binäre Datei in ihre hexadezimale Darstellung umwandeln kann und umgekehrt. Speichern Sie den Code als HexEncoder.js
oder wie auch immer Sie möchten, solange er die .js
Erweiterung 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(); }
So codieren Sie eine Binärdatei:
cscript /nologo /e:jscript HexEncoder.js /e "binary file" "output file"
Zurückkehren:
cscript /nologo /e:jscript HexEncoder.js /d "encoded file" "binary file"
Der folgende Befehl kodiert notepad.exe
und speichert die Ausgabe auf dem Desktop:
cscript /nologo /e:jscript HexEncoder.js /e "%windir%\notepad.exe" "%userprofile%\Desktop\notepad.exe-hex.txt"
Das Skript eignet sich am besten für kleine Dateien, z. B. unter 1024 KiB.
Eventuell können Sie diese Einschränkungen umgehen, indem Sie das obige Skript verwenden, um einen Encoder von Drittanbietern zu übertragen.