【发布时间】:2021-01-02 08:31:20
【问题描述】:
您好,祝您 2021 年更快乐、更健康!
我正在基于 Websockets 协议在 JS 客户端和 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(abyte);
}
var plain = pako.inflate(bytes);
var enc = "";
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);
//this is where the error happens
ba.uncompress();
}
错误是“错误:错误 #2058:解压缩数据时出错。” 我怀疑我从 pako.deflate 收到的字节与 AS3 使用的不同?
欢迎指点!
【问题讨论】:
-
如果我能解决这样的问题,我会用一些简单的短文本来跟踪和比较 JS 与 AS3 中编码的所有阶段:原始 > encodeURI > compress/deflate > base64 to看看它的发展方向不同。
-
在 AS3 中执行
ba.uncompress();部分之前,跟踪ba[0]和ba[1]的值是什么? -
这似乎是问题所在。 ba 可以追溯到: 120,156,203,72,205,201,201,87,53,50,40,207,47,202,73,1,0,33,27,4,196 这是 JS 中的 pako.defalte 生成的: Uint8Array(21) [ 120, 156, 203 , 72, 205, 201, 201, 87, 53, 50, 40,207,47,202,73,1,0,33,27,4,196 ] 格式好像和 AS3 ByteArray 有点不一样?
-
正确的 Zlib 标头确实以
120开头,后跟156,因此两个系统(AS3 和 JS)都显示正确的 Zlib 数据编号。在这一点上它应该工作......但不知何故,你违反了宇宙法则。我稍后会为您检查... -
好的。我发现了错误。相当愚蠢的一个,因为它大多是。 uint8Array 当然需要转换为二进制字符串...请参阅上面我编辑的帖子中的详细信息。
标签: javascript arrays actionscript-3