【问题标题】:Reading data from a SharedObject file directly直接从 SharedObject 文件中读取数据
【发布时间】: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


【解决方案1】:

我不使用 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();

还要查看InflateUncompress,以防数据在使用前必须展开。

【讨论】:

  • 感谢您的 cmets,但不幸的是,这不是问题所在,我已将数据位置正确定位在 AMF 数据的开头,但范围错误发生在 readObject() 调用中。我最终编写了自己的解析器,现在可以正常工作了。
猜你喜欢
  • 1970-01-01
  • 2010-11-08
  • 1970-01-01
  • 1970-01-01
  • 2022-04-29
  • 2021-01-18
  • 2013-09-06
  • 2015-08-27
  • 2021-10-26
相关资源
最近更新 更多