我使用Netty在Java中实现服务器实现,而客户端在Adobe Flash中实现。
当我在缓冲区中发送请求或响应时,我首先写的是缓冲区的长度,然后是数据。我正在使用服务器端的ChannelBuffer.writeInt()和客户端的ByteArray.writeInt()写入数据的长度,然后使用ByteArray.readInt()读取客户端和ChannelBuffer.readInt()的另一端用于服务器。
但是我为他们两个都得到了错误的价值。
我的问题是,当我在Java中执行ChannelBuffer.writeInt()/ ChannelBuffer.readInt()并在Adobe Flash actionscript中执行相应的ByteArray.readInt()/ ByteArray.writeInt()时,有什么区别吗?如果是,请告诉我它是什么以及如何使其工作。
我试图做一些移位操作以使其工作,但它不起作用。
这取决于Endianess吗?如果是,怎么办?
如果它不是依赖项,那么可能有任何依赖项吗?
谢谢
最佳答案
haraldK是完全正确的。当通过网络写出一个整数时(或者从技术上讲,当它被串行写出时),字节的接收顺序相反。使用netty通道缓冲区(和常规),此脚本使操作变得更容易。它以int 5开头,并写入LITTLE_ENDIAN缓冲区。然后将该缓冲区的内容复制到BIG_ENDIAN缓冲区中,并在读出,存在和不为5的int时将它们复制。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中交换值的字节序:
function swap32(val) {
return ((val & 0xFF) << 24)
| ((val & 0xFF00) << 8)
| ((val >> 8) & 0xFF00)
| ((val >> 24) & 0xFF);
}
输出:
> swap32(5)
> 83886080
> swap32(83886080)
> 5