ChannelBuffer readInt()/ writeInt()导致错误的值

时间:2013-06-12 10:31:07

标签: java actionscript-3 io netty

我在Java中使用Netty进行服务器实现,客户端在Adobe Flash中。

当我在缓冲区中发送请求或响应时,我首先写入缓冲区的长度,然后写入数据。我使用服务器端的ChannelBuffer.writeInt()和客户端的ByteArray.writeInt()编写数据长度,然后使用ByteArray.readInt()为客户端和ChannelBuffer.readInt()读取另一端的数据长度对于服务器。 但是我得到了两个错误的值。

我的问题是,当我在java中执行ChannelBuffer.writeInt()/ ChannelBuffer.readInt()并在Adobe Flash actionscript中执行相应的ByteArray.readInt()/ ByteArray.writeInt()时,是否存在差异。如果是,请告诉我它是什么以及如何使其发挥作用。

我试图进行一些位移操作以使其工作,但它不起作用。 这取决于Endianess吗?如果有,怎么样? 如果它不依赖,那么这可能依赖于什么?

由于

1 个答案:

答案 0 :(得分:0)

haraldK是完全正确的。当通过网络写出整数时(或者在技术上,当它被串行写入时),以相反的顺序接收字节。使用netty通道缓冲区(和groovy)这个脚本使得它变得更容易。它以 int 为5开始,并写入LITTLE_ENDIAN缓冲区。然后将该缓冲区的内容复制到BIG_ENDIAN缓冲区中,当读回时,将显示 int ,而不是5。int的基础字节已被反转。该脚本还打印int的二进制(位)表示,并且使用更高效的转换Integer.reverseBytes(int)执行相同的操作。

import org.jboss.netty.buffer.*;
import java.nio.*;

lBuff = ChannelBuffers.buffer(ByteOrder.LITTLE_ENDIAN, 4);
int a = 5;
lBuff.writeInt(a);
bBuff = ChannelBuffers.buffer(ByteOrder.BIG_ENDIAN, 4);
bBuff.writeBytes(lBuff);
int b = bBuff.readInt();
binString = Integer.toBinaryString(b);
println "Int: $b  ($binString), Reversed: ${Integer.reverseBytes(b)}";
lBuff.clear(); bBuff.clear();
lBuff.writeInt(b);
bBuff.writeBytes(lBuff);
b = bBuff.readInt();
println "Int: $b  (${Integer.toBinaryString(b)}), Reversed: ${Integer.reverseBytes(b)}";

输出如下:

Int: 83886080  (101000000000000000000000000), Reversed: 5 
Int: 5 (101), Reversed: 83886080

我对actionscript-3了解不多,但是link概述了如何在JavaScript中交换值的endianess:

function swap32(val) {
    return ((val & 0xFF) << 24)
           | ((val & 0xFF00) << 8)
           | ((val >> 8) & 0xFF00)
           | ((val >> 24) & 0xFF);
}

输出:

> swap32(5)
> 83886080
> swap32(83886080)
> 5