-4

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

4

1 回答 1

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++;
    };

然后使用顶部的大字符串作为选择数组来选择代表被删除的位的字符

    while (_local7 < _local4.length) {
        _local2 = (_local2 + BASE64_CHARS.charAt(_local4[_local7]));
        _local7++;
    };

在此处的 js 中:http: //jsfiddle.net/H4f2p/

我跑encodeByteArray('test')回来了dGVzdAAA

于 2013-03-08T19:48:03.863 回答