你好,祝你2021年快樂,更健康!
我正在為一個JS客戶端和AS3服務器之間建立一個小型的通信介面,該介面基于Websockets協議。
我正在一個JS客戶端和一個基于Websockets協議的AS3服務器之間建立一個小型通信介面。 由于各種原因,我需要對有效載荷進行壓縮和base64編碼。 從AS3到JS,一切都像這樣(使用https://github.com/blooddy/blooddy_crypto來處理Base64加密/解密) :
function encodeMessage(message: String):String{
var rawData:ByteArray=new ByteArray()
rawData.writeUTFBytes( encodeURIComponent(message) )。
rawData.compress()。
var b64 = Base64.encode(rawData)。
return b64;
};
在JS中用pako進行解碼,用于通貨膨脹(https://github.com/nodeca/pako):
decodePayload(payload){
let rawfile = (atob(payload));
var bytes = [];
for (var fileidx = 0; fileidx < rawfile.length; fileidx ) {
var abyte = rawfile.charCodeAt(fileidx) & 0xff;
bytes.push(akyte)。
}
var plain = pako.inflate(bytes)。
var enc = ""/span>;
for (var i = 0; i < plain.length; i ) {
enc = String.fromCharCode(plain[i])。
}
return decodeURIComponent(enc)。
}
現在,另一個方向產生了一些問題。 在JS中,我使用:
encodeMessage(message){
let enc = encodeURIComponent(message)
let zlib = pako.deflate(enc)
let b64 = btoa(zlib)。
return b64;
}
但是,我在AS3方面遇到了問題:
function decodePayload(payload:String) {
var ba:ByteArray = Base64.decode(payload)。
//這就是錯誤發生的地方。
ba.uncompress()。
}
錯誤是一個 "錯誤。Error #2058: There was an error decompressing the data"。 我懷疑我從pako.deflate收到的bytearry與AS3所使用的不同?
歡迎任何指點!
uj5u.com熱心網友回復:
解決方案是這樣的--當然是一個愚蠢的小疏忽;)
在JS的編碼函式中,Uint8Array在被Base64編碼之前需要被轉換為二進制字串:
function encodeMessage(message) {
let enc = encodeURIComponent(message)。
let zlib = pako.deflate(enc)。
let binstring = convertUint8ArrayToBinaryString(zlib)。
let b64 = btoa(binstring)。
return b64;
};
function convertUint8ArrayToBinaryString(u8Array) {
var i, len = u8Array.length, b_str = "";
for (i=0; i<len; i ) {
b_str = String.fromCharCode(u8Array[i])。
}
return b_str;
}
那么,在Roswell一切都很好。
。
uj5u.com熱心網友回復:
如果你的AS3代碼只是用在一個SWF檔案中,或者你有一個AIR專案,這并不明顯。
- 如果制作一個AIR專案:
嘗試使用uncompress.apply... (代碼尚未測驗)。
//# This is where the error happens.
//ba.uncompress();
//# try this...
ba.uncompress.apply(ba, ["deflate"/span>])。
- 如果制作一個SWF專案:
當我需要在瀏覽器上運行的SWF中使用Deflate演算法時,我使用了Zlib的一個埠。
獲取as3zlib。https://github.com/BenV/as3zlib(是Zlib的Java移植版)。
注意。雖然在JS中,讓本地變數比全域變數更好,但這是JavaScript的一個怪癖。 而實際上在大多數類 C 語言(Java、C#、AS3 等)中,情況正好相反,全域變數比每次呼叫函式時不斷創建區域 vars 的成本要低。
下面是一個使用例子:
//# import Zlib Class。
import Zlib。
//# setting global vars
var zlibdecomp :Zlib;
var ba :ByteArray = new ByteArray;
var decoded_BA :ByteArray = new ByteArray;
//# try Deflate algo....
function decodePayload(payload:String)
{
zlibdecomp = new Zlib;
ba.clear(); //in case it already has data from a prev decode。
//# 以下所有代碼都可以在這一行完成。
//ba = zlibdecomp.uncompress( Base64.decode(payload) );
ba = Base64.decode(payload)。
//# 這就是錯誤發生的地方...。
//ba.uncompress();
//# try this...
decoded_BA = zlibdecomp.uncompress( ba ); //inflate to original big from small/compressed
//ba = decoded_BA; //如果需要這種更新方式。
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/319506.html
標籤:
上一篇:吊艙中暫停容器的生命周期
