我目前正在将一些 ActionScript 翻译成 C#。大多数内容都是可以理解的,并且可以在将其转换为 C# 时轻松复制/改进。我在遵循提供基本功能的代码流时遇到了一个 utils 类。其中很多已经过时,所以我抛弃了大部分实用程序函数,并用 .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# 低级的东西很不熟悉,比如正确枚举字节数组和流,因为我通常不接触 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 实现对其进行正确编码?