直接从SharedObject文件读取数据

时间:2018-10-27 00:50:47

标签: actionscript-3 decode shared-objects

我正在尝试直接从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文件。

1 个答案:

答案 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)

还要查看InflateUncompress,以防万一在使用前必须先扩展数据。