2013-06-12 40 views
1

我使用Netty在Java中使用服务器实现,客户端位于Adobe Flash中。ChannelBuffer readInt()/ writeInt()导致错误值

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

我的问题是,当我在java中执行ChannelBuffer.writeInt()/ ChannelBuffer.readInt()并且在Adobe Flash actionscript中执行相应的ByteArray.readInt()/ ByteArray.writeInt()时,是否有区别。如果是的话,请告诉我它是什么以及如何使它工作。

我试图做一些位移操作使其工作,但它不起作用。 这是否依赖Endianess?如果是,如何? 如果它不是依赖的,那么这里可能有什么依赖?

谢谢

+0

给我们一个例子,说明你写的和你读过的东西。 –

+0

Endianness在这种情况下当然可以发挥作用。如果打印读取/写入的值为十六进制值,则应该很容易看到该模式是否反转(即:如果字节顺序错误,则0x00112233将为0x33221100)。 – haraldK

回答

0

haraldK是正确的。当一个整数在网络上写出来(或者从技术上讲,当它被串行写入时),字节以相反的顺序被接收。使用netty通道缓冲区(和常规)这个脚本使得它更容易发生什么。它以5的int开始并写入LITTLE_ENDIAN缓冲区。然后将该缓冲区的内容复制到一个BIG_ENDIAN缓冲区中,并在读出时返回,并且其中的内存不是5.该int的基本字节已被颠倒过来。该脚本还打印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 

我不知道动作-3多,但这个link概述了如何交换的值的字节序在JavaScript:

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

输出:

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