Base64编码、解码的基本方法,及byteArray = base64.toByteArray();抛出A partial block (2 of 4 bytes) was dropped. Decoded data is probably trunca

    AS3中Base64的编码和解码都很方便,例如对经过Base64编码后的字符串b64Str,可以用如下方法进行解码:

<textarea cols="50" rows="15" name="code" class="java">private function decodeBin(b64Str:String):Array { var base64:Base64Decoder; var btyArray:ByteArray; base64 = new Base64Decoder(); base64.decode(b64Str); btyArray = base64.toByteArray(); btyArray.endian = Endian.LITTLE_ENDIAN;//Endian.BIG_ENDIAN; //下面就可以从ByteArray中读取数据了 var temp1:int = btyArray.readInt(); var temp2:float = btyArray.readFloat(); &hellip;&hellip; &hellip;&hellip; }</textarea>

 

    当然,上面的参数b64Str里存放的数据有一定的格式(比如是先放一个int,再放一个float……还是先放一个int,再放一个String),不知道数据的格式是无数解码的,至于格式怎么定,完全由你自己来决定。定好数据格式后,你就可以利用Base64来编码,生成上面的b64Str。一般的编码过程如下:

<textarea cols="50" rows="15" name="code" class="java">private function encode():String { var b64Str:String; var base64:Base64Encoder = new Base64Encoder (); var btyArray:ByteArray = new ByteArray(); btyArray.endian = Endian.LITTLE_ENDIAN;//Endian.BIG_ENDIAN; //////////////////////////根据自己的数据格式往ByteArray中写数据 btyArray.writeInt(1);//比如先写一个int btyArray.writeFloat(2.9);//再写一个float &hellip;&hellip; &hellip;&hellip; /////////////////////////////// base64.encodeBytes(btyArray); b64Str = base64.toString(); return b64Str; }</textarea>

 

但有的时候在执行btyArray = base64.toByteArray();时会抛出异常,提示“A partial block (2 of 4 bytes) was dropped. Decoded data is probably truncated!”,这时很有可能是由于binStr中含有空格,而这个空格很可能是字符'+'号转化成的,所以只要把空格还原成"+"即可,代码如下:

<textarea cols="50" rows="15" name="code" class="java"> var myPattern:RegExp = //s/gi; binStr = binStr.replace(myPattern, '+');</textarea>

如果还是不行,可以考虑用下面的方法:

 

<textarea cols="50" rows="15" name="code" class="java">private function decodeBin(b64Str:String):Array { var base64:Base64Decoder; var btyArray:ByteArray; base64 = new Base64Decoder(); base64.decode(b64Str); try{ btyArray = base64.toByteArray(); }catch(e:Error) { //trace(e.message); btyArray = this.myDecode(b64Str); } btyArray.endian = Endian.LITTLE_ENDIAN;//Endian.BIG_ENDIAN; //下面就可以从ByteArray中读取数据了 var temp1:int = btyArray.readInt(); var temp2:float = btyArray.readFloat(); &hellip;&hellip; &hellip;&hellip; }</textarea>

其中myDecode方法定义如下:

<textarea cols="50" rows="15" name="code" class="java"> private function myDecode(binStr:String):ByteArray { var key:String = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; var index:int = 0; var byteArr1:ByteArray = new ByteArray(); for (var i:int = 0; i &lt; binStr.length; i = i + 4) { var tempByte:uint = (key.indexOf(binStr.charAt(i)) &amp; 255) &lt;&lt; 18 | (key.indexOf(binStr.charAt(i + 1)) &amp; 255) &lt;&lt; 12 | (key.indexOf(binStr.charAt(i + 2)) &amp; 255) &lt;&lt; 6 | key.indexOf(binStr.charAt(i + 3)) &amp; 255; byteArr1[index++] = (tempByte &amp; 16711680) &gt;&gt; 16; byteArr1[index++] = (tempByte &amp; 65280) &gt;&gt; 8; byteArr1[index++] = tempByte &amp; 255; } var byteArr2:ByteArray = new ByteArray(); // end of for if (binStr.charCodeAt( -1) == 61) byteArr1.readBytes(byteArr2, 0, byteArr1.length - 1); else byteArr1.readBytes(byteArr2, 0, byteArr1.length - 2); return byteArr2; } </textarea>

你可能感兴趣的:(String,function,float)