-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 に実装されているか、Web で優れたスニペットを検索します。

しかし、私はこの機能で頭が痛くなります。ネーミングは恐ろしいです:

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);

3バイトが不足した場合に備えて、4バイトの結果を「64」で埋めます

    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 に答える