需要了解这个可怕的ActionScript

时间:2013-03-08 19:18:13

标签: c# actionscript-3 actionscript

我目前正在将一些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实现对其进行正确编码?

1 个答案:

答案 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