我目前正在将一些ActionScript翻译成C#。大多数内容都是可以理解的,并且可以在将其转换为C#时轻松复制/改进。我在遵循代码流程时遇到了一个utils类,它提供了基本的功能。很多是oboloete,所以我抛弃了大多数实用程序函数,并用.NET框架已经提供的更合适的方法替换它们。
这是一个例子:
// ActionScript
public static function encode(_arg1:String):String{
var _local2:ByteArray = new ByteArray();
_local2.writeUTFBytes(_arg1);
return (encodeByteArray(_local2));
}
// Corresponding C#
public static string encode(string _arg1) {
return Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes(_arg1));
}
为了清楚起见,我只是将参数名称保留为,尽管命名很糟糕。 我对C#-low级别的东西很不熟悉,比如正确地枚举字节数组和流,因为我通常不会接触C#的那部分。如果我需要一些工具,我通常会发现它已经在.NET中实现,或者在网上搜索了很棒的片段。
虽然我对这个功能感到头疼。咆哮是可怕的:
private static const BASE64_CHARS:String =
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
public static function encodeByteArray(_arg1:ByteArray):String{
var _local3:Array;
var _local5:uint;
var _local6:uint;
var _local7:uint;
var _local2 = "";
var _local4:Array = new Array(4);
_arg1.position = 0;
while (_arg1.bytesAvailable > 0) {
_local3 = new Array();
_local5 = 0;
while ((((_local5 < 3)) && ((_arg1.bytesAvailable > 0)))) {
_local3[_local5] = _arg1.readUnsignedByte();
_local5++;
};
_local4[0] = ((_local3[0] & 252) >> 2);
_local4[1] = (((_local3[0] & 3) << 4) | (_local3[1] >> 4));
_local4[2] = (((_local3[1] & 15) << 2) | (_local3[2] >> 6));
_local4[3] = (_local3[2] & 63);
_local6 = _local3.length;
while (_local6 < 3) {
_local4[(_local6 + 1)] = 64;
_local6++;
};
_local7 = 0;
while (_local7 < _local4.length) {
_local2 = (_local2 + BASE64_CHARS.charAt(_local4[_local7]));
_local7++;
};
};
return (_local2);
}
我的猜测是,这会将byte[]
中的数据解码为Base64字符串。如果你注意了,你会看到我提到的第一个功能使用了这个功能。这是因为提到的C#实现已经过时了吗?或者我的C#实现错了?如果它我需要一个线索,而不是整个实现。 :)
这是我的上一个问题:作者将ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=
声明为Base64字符。这是65!维基百科告诉我Base64不包含字符=
。如果旧数据已经使用“错误”字符集进行编码会怎么样?我是否需要使用相应的错误,写得很糟糕的解码方法对其进行解码,然后使用.NET实现对其进行正确编码?
答案 0 :(得分:1)
假设这种语言将_arg1视为仅向前读取流,则从输入字符串一次取3个字节,
while ((((_local5 < 3)) && ((_arg1.bytesAvailable > 0)))) {
_local3[_local5] = _arg1.readUnsignedByte();
_local5++;
};
将它们分成4个'插槽'
_local4[0] = ((_local3[0] & 252) >> 2);
_local4[1] = (((_local3[0] & 3) << 4) | (_local3[1] >> 4));
_local4[2] = (((_local3[1] & 15) << 2) | (_local3[2] >> 6));
_local4[3] = (_local3[2] & 63);
使用'64'填充4字节结果,以防3个字节短缺
while (_local6 < 3) {
_local4[(_local6 + 1)] = 64;
_local6++;
};
然后使用顶部的大字符串作为pick数组来选择代表munged位的字符
while (_local7 < _local4.length) {
_local2 = (_local2 + BASE64_CHARS.charAt(_local4[_local7]));
_local7++;
};
在js中:http://jsfiddle.net/H4f2p/
我跑了encodeByteArray('test')
并回来dGVzdAAA