【问题标题】:Need a hand with understanding this horribly written ActionScript需要帮助理解这个写得很糟糕的 ActionScript
【发布时间】:2013-03-08 19:18:13
【问题描述】:

我目前正在将一些 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 中实现,或者在网上搜索很棒的 sn-ps

不过,我对这个功能感到头疼。名字太可怕了:

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 实现对其进行正确编码?

【问题讨论】:

  • 建议使用他的一些现有数据和他当前的代码生成的内容来构建一组单元测试,您可以使用这些测试来验证您的实现(假设您可以执行他的动作脚本),包括要捕获的内容这个“=”问题。
  • 人类无法编写这样的代码。一定是某种混淆工具。
  • @Mikeb:我不得不承认我刚刚猜到这是 ActionScript。我不熟悉 Adob​​e 的 IDE,只是阅读和浏览 Notepad++ 中的代码。懂一点 JS 就得到了代码的含义。
  • @J0HN:我不能告诉你我收到的代码是否被混淆和反编译。我刚拿到代码。这有关系吗?虽然我的猜测是,代码可能已经过优化(压缩?)。可以被人类阅读(主要是^^)的混淆代码并没有真正被混淆,是吗?
  • 你看的函数是反编译代码,这里是原文链接code.google.com/p/as3crypto/source/browse/trunk/as3crypto/src/…为什么我感觉你在偷别人的应用。

标签: c# actionscript-3 actionscript


【解决方案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

【讨论】:

  • 非常感谢这个令人满意的答案。
猜你喜欢
  • 1970-01-01
  • 2019-08-11
  • 2016-07-08
  • 2016-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-29
  • 2020-07-04
相关资源
最近更新 更多