2016-04-09 32 views
-3

konusundaki sorun nedir ve şimdi Flash Actionscript 3.0 geliştirme işlemini yapıyorum, encodeByteArray (...) ve decodeToByteArray (...) işleviyle bir Base64bitEncoder sınıfı var. ancak aşağıdaki kodları yazdığımda, kodlamadan önce ve kod çözme işleminden sonra byteArray.length, nerede yanlış olduğumu görmeye yardımcı olabilir misiniz? aşağıdaBase64bitEncoder.decodeToByteArray

Testi Örnek Kod: aşağıdaki gibi

 var _loc_2:XML = new XML("<formXML>aaaaa</formXML>");; 

     var _loc_3:ByteArray; 
     _loc_3 = new ByteArray(); 
     //_loc_3.endian = Endian.LITTLE_ENDIAN; 
     _loc_3.writeUTFBytes(_loc_2); 
     trace("Before Encoding Length:" + _loc_3.length); 

     var baseString:String = Base64bitEncoder.encodeByteArray(_loc_3); 
     trace(baseString); 


     var strArray:ByteArray = Base64bitEncoder.decodeToByteArray(baseString); 
     trace("After Decoding length:" + strArray.length); 

Çıktı günlüğü:

Before Encoding Length:5 

GFhAGFhA 

After Decoding length:**6** 

Neden yanlış yaptıktan sonra is 6,? aşağıda

Base64bitEncoder kaynak kodu:

package 
{ 
    import flash.utils.*; 

    public class Base64bitEncoder extends Object 
    { 
     private static const BASE64_CHARS:String = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz/="; 
     private static const BASE64_URL_CHARS:String = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-_!"; 

     public function Base64bitEncoder() 
     { 
      return; 
     }// end function 

     public static function encode(param1:String, param2:Boolean = false) : String 
     { 
      var _loc_3:ByteArray; 
      _loc_3 = new ByteArray(); 
      _loc_3.writeUTFBytes(param1); 
      return encodeByteArray(_loc_3, param2); 
     }// end function 

     public static function decodeToByteArray(param1:String, param2:Boolean = false) : ByteArray 
     { 
      var _loc_3:ByteArray; 
      var _loc_4:Array; 
      var _loc_5:Array; 
      var _loc_6:uint; 
      var _loc_7:uint; 
      var _loc_8:uint; 
      _loc_3 = new ByteArray(); 
      _loc_4 = new Array(4); 
      _loc_5 = new Array(3); 
      _loc_6 = 0; 
      while (_loc_6 < param1.length) 
      { 
       // label 
       _loc_7 = 0; 
       while (_loc_7++ < 4 && _loc_6 + _loc_7 < param1.length) 
       { 
        // label 
        _loc_4[_loc_7] = param2 == true ? (BASE64_URL_CHARS.indexOf(param1.charAt(_loc_6 + _loc_7))) : (BASE64_CHARS.indexOf(param1.charAt(_loc_6 + _loc_7))); 
       }// end while 
       _loc_5[0] = (_loc_4[0] << 2) + ((_loc_4[1] & 48) >> 4); 
       _loc_5[1] = ((_loc_4[1] & 15) << 4) + ((_loc_4[2] & 60) >> 2); 
       _loc_5[2] = ((_loc_4[2] & 3) << 6) + _loc_4[3]; 
       _loc_8 = 0; 
       while (_loc_8++ < _loc_5.length) 
       { 
        // label 
        if (_loc_4[_loc_8 + 1] == 64) 
        { 
         break; 
        }// end if 
        _loc_3.writeByte(_loc_5[_loc_8]); 
       }// end while 
       _loc_6 = _loc_6 + 4; 
      }// end while 
      _loc_3.position = 0; 
      return _loc_3; 
     }// end function 

     public static function encodeByteArray(param1:ByteArray, param2:Boolean = false) : String 
     { 
      var _loc_3:String; 
      var _loc_4:Array; 
      var _loc_5:Array; 
      var _loc_6:uint; 
      var _loc_7:uint; 
      var _loc_8:uint; 
      _loc_3 = ""; 
      _loc_5 = new Array(4); 
      param1.position = 0; 
      while (param1.bytesAvailable > 0) 
      { 
       // label 
       _loc_4 = []; 
       _loc_6 = 0; 
       while (_loc_6++ < 3 && param1.bytesAvailable > 0) 
       { 
        // label 
        _loc_4[_loc_6] = param1.readUnsignedByte(); 
       }// end while 
       _loc_5[0] = (_loc_4[0] & 252) >> 2; 
       _loc_5[1] = (_loc_4[0] & 3) << 4 | _loc_4[1] >> 4; 
       _loc_5[2] = (_loc_4[1] & 15) << 2 | _loc_4[2] >> 6; 
       _loc_5[3] = _loc_4[2] & 63; 
       _loc_7 = _loc_4.length; 
       while (_loc_7++ < 3) 
       { 
        // label 
        _loc_5[_loc_7 + 1] = 64; 
       }// end while 
       _loc_8 = 0; 
       while (_loc_8++ < _loc_5.length) 
       { 
        // label 
        _loc_3 = _loc_3 + (param2 == true ? (BASE64_URL_CHARS.charAt(_loc_5[_loc_8])) : (BASE64_CHARS.charAt(_loc_5[_loc_8]))); 
       }// end while 
      }// end while 
      return _loc_3; 
     }// end function 

     public static function decode(param1:String, param2:Boolean = false) : String 
     { 
      var _loc_3:ByteArray; 
      _loc_3 = decodeToByteArray(param1, param2); 
      return _loc_3.readUTFBytes(_loc_3.length); 
     }// end function 

    } 
} 
+2

:

güncelleme kodu Bir Base64bitEncoder sınıf var ... "Ben Flaş AS3 do ... Ben test kodunun altına yazmak ... Ben yanlış ... Yanlış yapıyorum "... ama dediğin gibi, gerçekten yanlış yapıyorsun! Kendi kodunuzu yazmaya çalışın, eğer problemleriniz varsa, onları buraya gönderin ve kesinlikle yardım alacaksınız, fakat başkalarının kodunu kullanırken değil! – akmozo

+0

@akmozo, Evet, haklısınız, Base64bitEncoder sınıf kodu benim tarafımdan geliştirilmiyor, sadece ona başvuruyorum. Ancak, Base64 ile aşina olmadığım için, decodeByteArray yönteminde bir sorun olabileceğini fark ettim, bu nedenle, Master'ın sorunun nerede olduğunu gösterip gösteremeyeceğini görmek için buradaki kodu geçtim. Teşekkürler. –

+0

Sorununuz AS3'te Base64 veya sadece bu kod ile mi? Bunu yapmak için pek çok [AS3 kitaplığı] vardır (http://stackoverflow.com/questions/6625347/best-class-for-base64-encoding-decoding-action-script) (ve bunların çoğu açık kaynaktır). . – akmozo

cevap

0

@akmozo, bugün, ben, teşekkürler sorunu gidermek, base64 teorisini incelemek için biraz zaman harcamak.

bir Decompiled kod ve senin değil, bu yüzden anlattı neden
public static function encodeByteArray(param1:ByteArray, param2:Boolean = false) : String 
    { 
     var _loc_3:String; 
     var _loc_4:Array; 
     var _loc_5:Array; 
     var _loc_6:uint; 
     var _loc_7:uint; 
     var _loc_8:uint; 
     _loc_3 = ""; 
     _loc_5 = new Array(4); 
     param1.position = 0; 
     while (param1.bytesAvailable > 0) 
     { 
      // label 
      _loc_4 = []; 
      _loc_6 = 0; 
      while (_loc_6 < 3 && param1.bytesAvailable > 0) 
      { 
       // label 
       _loc_4[_loc_6] = param1.readUnsignedByte(); 
       _loc_6 = _loc_6 + 1; 

      }// end while 
      _loc_5[0] = (_loc_4[0] & 252) >> 2; 
      _loc_5[1] = (_loc_4[0] & 3) << 4 | _loc_4[1] >> 4; 
      _loc_5[2] = (_loc_4[1] & 15) << 2 | _loc_4[2] >> 6; 
      _loc_5[3] = _loc_4[2] & 63; 

      /* 
      trace("--------------------------------"); 
      trace("0:" + _loc_4[0]); 
      trace("1:" + _loc_4[1]); 
      trace("3:" + _loc_4[2]); 

      trace("len:"+_loc_4.length); 

      trace("++++++++++++++++++++++++++++++++"); 
      */ 

      _loc_7 = _loc_4.length; 

      while (_loc_7 < 3) 
      { 
       // label 
       _loc_5[_loc_7 + 1] = 64; 
       _loc_7 = _loc_7 + 1; 
      }// end while 
      _loc_8 = 0; 
      while (_loc_8 < _loc_5.length) 
      { 
       // label 
       _loc_3 = _loc_3 + (param2 == true ? (BASE64_URL_CHARS.charAt(_loc_5[_loc_8])) : (BASE64_CHARS.charAt(_loc_5[_loc_8]))); 
       _loc_8 = _loc_8 + 1; 
      }// end while 
     }// end while 
     return _loc_3; 
    }// end function 

    public static function decodeToByteArray(param1:String, param2:Boolean = false) : ByteArray 
    { 
     var _loc_3:ByteArray; 
     var _loc_4:Array; 
     var _loc_5:Array; 
     var _loc_6:uint; 
     var _loc_7:uint; 
     var _loc_8:uint; 
     _loc_3 = new ByteArray(); 
     _loc_4 = new Array(4); 
     _loc_5 = new Array(3); 
     _loc_6 = 0; 
     while (_loc_6 < param1.length) 
     { 
      // label 
      _loc_7 = 0; 
      while (_loc_7 < 4 && _loc_6 + _loc_7 < param1.length) 
      { 
       // label 
       _loc_4[_loc_7] = param2 == true ? (BASE64_URL_CHARS.indexOf(param1.charAt(_loc_6 + _loc_7))) : (BASE64_CHARS.indexOf(param1.charAt(_loc_6 + _loc_7))); 
       _loc_7 = _loc_7 + 1; 
      }// end while 
      _loc_5[0] = (_loc_4[0] << 2) + ((_loc_4[1] & 48) >> 4); 
      _loc_5[1] = ((_loc_4[1] & 15) << 4) + ((_loc_4[2] & 60) >> 2); 
      _loc_5[2] = ((_loc_4[2] & 3) << 6) + _loc_4[3]; 
      _loc_8 = 0; 
      while (_loc_8 < _loc_5.length) 
      { 
       // label 
       if (_loc_4[_loc_8 + 1] == 64) 
       { 
        break; 
       }// end if 
       _loc_3.writeByte(_loc_5[_loc_8]); 
       _loc_8 = _loc_8 + 1; 
      }// end while 
      _loc_6 = _loc_6 + 4; 
     }// end while 
     _loc_3.position = 0; 
     return _loc_3; 
    }// end function