gpt4 book ai didi

java - ChannelBuffer readInt()/writeInt() 导致错误值

转载 作者:行者123 更新时间:2023-12-01 04:37:54 27 4
gpt4 key购买 nike

我使用 Netty 在 Java 中实现服务器,客户端在 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 吗?如果是,怎么办?如果它不依赖,那么是否有任何可能依赖的东西?

谢谢

最佳答案

haraldK 说得完全正确。当通过网络写出整数时(或者从技术上讲,当它串行写入时),字节以相反的顺序接收。使用 netty channel 缓冲区(和 groovy),这个脚本使发生的事情变得更容易。它以 int 5 开头,并写入 LITTLE_ENDIAN 缓冲区。然后,该缓冲区的内容被复制到 BIG_ENDIAN 缓冲区中,当读回时,会出现 int ,其中 os 不是 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

关于java - ChannelBuffer readInt()/writeInt() 导致错误值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17063246/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com