【问题标题】:ChannelBuffer readInt()/writeInt() results in wrong valueChannelBuffer readInt()/writeInt() 导致错误值
【发布时间】:2013-06-12 10:31:07
【问题描述】:

我在 Java 中使用 Netty 实现服务器,而客户端在 Adob​​e Flash 中。

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

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

我试图做一些位移操作来使它工作,但它不起作用。 这取决于 Endianess 吗?如果是,如何? 如果它不依赖,那么它可能依赖于什么?

谢谢

【问题讨论】:

  • 给我们举个例子,说明你写的和读回来的。
  • Endianness is 当然可以在这种情况下发挥作用。如果您将读/写的值打印为十六进制值,您应该很容易看到模式是否反转(即:如果字节顺序错误,0x00112233 将是 0x33221100)。

标签: java actionscript-3 io netty


【解决方案1】:

haraldK 是完全正确的。当一个整数通过网络写出时(或者从技术上讲,当它被串行写入时),字节以相反的顺序被接收。使用 netty 通道缓冲区(和 groovy)这个脚本使它更容易发生什么。它以 5 的 int 开始并写入 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 中交换值的字节顺序:

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

输出:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-18
    • 1970-01-01
    相关资源
    最近更新 更多