我可以通过 Citrix 远程桌面访问运行 Windows 2000 的远程服务器。该服务器无法访问任何互联网。传输数据的唯一方法是通过远程桌面复制文本。出于某种原因,复制文件不起作用,只能复制文本,但至少可以达到 10Mb。
是否有任何内置工具(在 Windows 2000 中)可以帮助我将二进制文件编码和解码为文本(Base64、uEncode、hex 等任何内容……)?
答案1
是的,其实。
从 cmd.exe,
要对文件进行编码:certutil -encode inputFileName encodedOutputFileName
要解码文件:certutil -decode encodedInputFileName decodedOutputFileName
答案2
这是我编写的基于 JScript 的脚本,它可以将二进制文件转换为十六进制表示,反之亦然。将代码保存为HexEncoder.js
,或任何您想要的名称,只要它具有.js
扩展名即可。
// 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();
}
句法
对二进制文件进行编码:
cscript /nologo /e:jscript HexEncoder.js /e "binary file" "output file"
要恢复:
cscript /nologo /e:jscript HexEncoder.js /d "encoded file" "binary file"
示例用法
以下命令将编码notepad.exe
并将输出保存到桌面:
cscript /nologo /e:jscript HexEncoder.js /e "%windir%\notepad.exe" "%userprofile%\Desktop\notepad.exe-hex.txt"
已知限制
编码文件的大小是原始文件的两倍。
该脚本最适合小文件,例如 1024 KiB 以下。
最终,您可以使用上面的脚本传输一些第三方编码器来解决这些限制。