我正在尝试直接从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文件。
答案 0 :(得分:0)
我不使用sharedObjects(从不需要它们),所以我只能建议字节。每当您收到“超出范围/边界”错误时,都可以通过检查和更正字节数组的.position
来解决。
在您的情况下,请首先跟踪位置data
和长度Object
,以确保前面(从当前位置)有足够的数据来读取其余字节中的.writeBytes
。
其他尝试解决“超出范围” 错误的选项:(使用.readBytes
而不是var data:ByteArray = new ByteArray();
//or replace "stream.position" with offset value where you think "Object" data begins
data.writeBytes( stream, stream.position, stream.bytesAvailable );
data.position = 0; //reset before reading
var sharedObjectData:Object = data.readObject();
)
(2000, 2)
还要查看Inflate
和Uncompress
,以防万一在使用前必须先扩展数据。