【问题标题】:AS3 size of data types for byte arrays字节数组的数据类型的 AS3 大小
【发布时间】:2016-01-15 17:02:36
【问题描述】:

我有一个字节数组,我想将前 10 个字节存储为字符串,接下来的 138 个字节是垃圾,然后接下来的 4 个字节应该是一个数字。我有一些代码,但它没有像我预期的那样工作,我得到了一个我没想到的数字。

var byteData:ByteArray;
var store:ByteArray;
var url:URLRequest = new URLRequest("file.bin");
var loader:URLLoader = new URLLoader();

loader.dataFormat = URLLoaderDataFormat.BINARY;
loader.load(url);
loader.addEventListener(Event.COMPLETE, loaderComplete);

function loaderComplete(e:Event):void
{
    byteData = new ByteArray();
    store = new ByteArray();
    byteData.position = 0;
    byteData.endian = Endian.LITTLE_ENDIAN;
    store.position = 0;
    store.endian = Endian.LITTLE_ENDIAN;
    name_string = loader.data.readMultiByte(10,"iso-8859-01");
    loader.data.readBytes(byteData,loader.data.position,138);
    loader.data.readBytes(store,loader.data.position,4);
    trace(store);
}

或者如果我读到一个 int:trace(loader.data.readInt());我仍然得到错误的值。

抱歉,我不擅长字节数组。

对于 as3,int 是 4x 字节还是应该是短字节?

在哪里可以找到数据类型的字节大小?谢谢。

【问题讨论】:

  • 你使用的是什么类型的加载器?
  • 是的,4 个字节用于 int help.adobe.com/en_US/as3/mobile/…
  • 感谢 4 个字节。在编辑中添加了加载程序信息....任何想法为什么我得到错误的int?我是否正确使用了 readbytes? ——
  • 这与上一个问题有什么关系? stackoverflow.com/questions/34775001/…
  • @iain 只是猜测,但我不确定您是否需要设置偏移量。尝试将两个调用 readBytes() 的第二个参数设置为零?

标签: arrays actionscript-3 bytearray


【解决方案1】:

首先确保您检查此内容以供参考:AS3 ByteArray API

还要注意,在 AS3 中读取字节值会自动移动指针的位置。它必须跨过字节槽才能知道它们的值,所以要读取一个整数,它将在运行之前从任何位置向前移动 4 个字节:myInt = myBytes.readUnsignedInt();

readByteswriteBytes 仅用于在 ByteArray 之间复制字节。
要获取实际字节值,请使用:(引用自 this Answer

要检查任何字节(其值),请使用以下方法更新一些 int 类型的变量:

  • 读取[单字节值]:使用my_Integer = source_BA.readByte();
  • 读取一个[双字节值]:使用my_Integer = source_BA.readUnsignedShort();
  • 读取[四字节值]:使用my_Integer = source_BA.readUnsignedInt();
  • 变量Number [八字节值]:使用my_Number = source_BA.readDouble();


无论如何,请在您的函数中尝试以下代码...

function loaderComplete(e:Event):void
{
    byteData = new ByteArray();
    store = new ByteArray();

    //# set both vars to same values at once by chaining
    byteData.position = store.position = 0; 
    byteData.endian = store.endian = Endian.LITTLE_ENDIAN;

    //# put bytes into byteData
    byteData = URLLoader(e.target).data as ByteArray;
    //byteData = ByteArray(loader.data); //shorter but untested

    //# 1) Get 10 character string
    name_string = byteData.readUTFBytes( 10 );

    //# 2) Skip the +138 bytes
    byteData.position = 9; //if paranoid just manually set pointer to pos 9 (for 10th byte)
    byteData.position += 138; //increment forward by Plus 138 bytes from current pos 

    //# 3)  Extract (4 byte) Integer from pointer offset 148
    var my_Number : int = byteData.readUnsignedInt(); //moves pointer Plus 4 bytes after reading

    trace( "my_Number from bytes is : " + my_Number );
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-16
    • 1970-01-01
    • 1970-01-01
    • 2011-04-27
    • 1970-01-01
    • 2021-12-11
    • 1970-01-01
    相关资源
    最近更新 更多