【发布时间】:2018-10-27 00:50:47
【问题描述】:
我正在尝试直接从 as3 中的 SharedObject (.sol) 文件读取数据。我已经能够提取标题信息:
// HEADER BYTES
var header1:int = stream.readShort();
// LENGTH
var length:int = header1 & 0x3f;
if (length == 0x3f)
length = stream.readInt();
// FILETYPE - should be "TCSO"
var sig:String = stream.readUTFBytes( 4 );
// PAD: Unused, 6 bytes long 0x00 0x04 0x00 0x00 0x00 0x00 0x00
var pad:ByteArray = new ByteArray();
stream.readBytes( pad, 0, 6 );
// NAME
// 2 byte short length
var nameLength:int = stream.readUnsignedShort();
var name:String = stream.readUTFBytes( nameLength );
var amfVersion:int = stream.readInt();
但我无法解释以下数据:
var data:ByteArray = new ByteArray();
stream.readBytes( data );
我相信它被存储为 AMF 数据,因此 ByteArray.readObject 函数应该正确解码它:
var sharedObjectData:Object = data.readObject();
但是,我的所有测试对象都出现范围错误,这会失败。
有谁知道 SharedObject 中数据的格式或如何解码?
原因:我这样做是因为我们部署了一个应用程序并意外更改了 swf 的名称,这使得 SharedObject 无法使用 SharedObject 类访问。
即。 app_new.swf 中的 SharedObject 无法读取 #SharedObjects/app.swf/objectname.sol
因此需要使用直接文件访问来解析sol SharedObject 文件。
【问题讨论】:
-
请解释一下这是什么意思?好吧,除了将其作为概念证明来阅读。
-
已添加到问题中。
-
为什么不直接将 sol 重新定位到 SWF 期望的位置?
-
嗯,是的,我可以复制新的,移动旧的,读取它,到内存,复制旧的并读到内存,然后合并并创建一个新的,但希望简化合并并且认为读取文件不会那么难?
-
不幸的是,如果名称不匹配,SharedObject 将失败,该名称在文件中使用(见上文)并作为文件名,因此您不能只使用临时名称。
标签: actionscript-3 decode shared-objects