文章目录
  1. 1. 官方文档注解如下
  2. 2. 注意 length 参数

AS3 里 ByteArray.readBytes 函数的 length 参数为 0 时并非是读 0 个字节。

官方文档注解如下

1
2
3
4
5
6
7
8
9
public function readBytes(bytes:ByteArray, offset:uint = 0, length:uint = 0):void

Reads the number of data bytes, specified by the length parameter, from the byte stream. The bytes are read into the ByteArray object specified by the bytes parameter, and the bytes are written into the destination ByteArray starting at the position specified by offset.

Parameters

bytes:ByteArray -- The ByteArray object to read data into. 
offset:uint (default = 0) -- The offset (position) in bytes at which the read data should be written. 
length:uint (default = 0) -- The number of bytes to read. The default value of 0 causes all available data to be read.

注意 length 参数

第 3 个参数 length,如果传 0 表示将 ByteArray 里的剩余数据全部读进 bytes 里,与通常的 API 理解不一致。

这点有点怪异,我的程序里,ByteArray 类型的 buff 需要从 ByteArray 类型的 recvBuff 里读取指定数量的字节数。字节数有可能是 0(protobuf 里,如果全为 optional 字段,并且没有设定值,这个 protobuf 协议序列化的结果就是 0 字节),企图用 recvBuff.readBytes(buff, 0, 0) 来读取 0 字节是不能达到目的的。

recvBuff 里还有其他的网络包数据,如果用 readBytes(buff, 0, 0) 会把recvBuff 里其他网络包的数据读给了当前 buff,然后交给当前包对应的protobuf 类来反序列化,就错了。

症状如下,方便大家搜索到此文:

1
2
3
Bad data format: **.** cannot be set twice.
invalid nested message
message length = 1

文章目录
  1. 1. 官方文档注解如下
  2. 2. 注意 length 参数