注意 ByteArray.readBytes 函数的 length 参数
AS3 里 ByteArray.readBytes
函数的 length 参数为 0 时并非是读 0 个字节。
官方文档注解如下
1 | public function readBytes(bytes:ByteArray, offset:uint = 0, length:uint = 0):void |
注意 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
3Bad data format: **.** cannot be set twice.
invalid nested message
message length = 1