- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我使用 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 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/
如何从文件中读取数字?当我使用 readInt 方法时,我得到一个很大的数字,并且它不等于文件中的数字。如何解决? 扫描仪不是一个好主意,因为文件包含超过 10 亿个数字,这将需要很长时间。 这是一个
scala 的命令行解释器显示: scala> Console.readInt warning: there was one deprecation warning; re-run with -dep
我尝试将一些整数和 double 以二进制格式保存到 txt 文件。我认为数字保存正确,但问题是当我尝试使用 readInt() 读取整数时。例如,当整数的值为 12 时,该整数的程序输出为 2087
我想解决一个小问题,但对我来说这是一个大问题。 “该程序应首先询问用户 N;如果 N 超出所需范围,则应再次询问用户。” ACM 库: int N = readInt("Enter N (0 10)
我无法执行 readInt() 但 readObject 工作正常。给我建议一些解决方案。我在服务器端使用以下代码: ObjectInputStream din = new ObjectInputSt
我正在尝试迭代对象数组,并使用扫描仪设置其中一个实例变量。这是引发错误的代码: public void populate(){ int participantID = 0; Scan
我正在构建一个客户端-服务器 Java 应用程序。问题是,当我用 writeInt() 发送 Integer 时,有时它会阻塞 readInt()。 客户端 PrintWriter socketOut
我在我的手机 (Android) 和我的服务器之间做了一个简单的套接字。 手机可以连接到服务器,但我可以为彼此发送或读取数据。 这是我为我的客户(电话端)使用的代码: private static v
我正在使用 Java 套接字让两个 Android 设备与同一个应用进行通信。通信协议(protocol)为: 1. client sends packet size S 2. client send
我有一个输入流来自黑盒(比如 B)。来自这个流的所有消息都是序列化的二进制数据,每条消息都以一个四字节的 int 开头。其中大部分用于记录数据并每天 24 小时运行。我使用 readInt() 方法读
这个问题已经有答案了: How to get the user input in Java? (29 个回答) 已关闭 7 年前。 这是我的代码: import java.io.PrintWriter
我使用 Netty 在 Java 中实现服务器,客户端在 Adobe Flash 中。 当我在缓冲区中发送请求或响应时,我首先写入缓冲区的长度,然后写入数据。我在服务器端使用 ChannelBuf
我是网络编程的新手。 我在一个线程中运行了以下源代码。在其他线程中,我正在关闭 istream、ostream 和 socket,但下面的代码仍然没有打印出 IOException。我在 Androi
我正在使用外部排序和合并来对整数文件进行排序。通常,解决此问题的方法是使用 -Xmx 增加 JVM 的堆大小,但我想知道是否存在一种方法可以在不增加堆大小的情况下改进我的代码。 抛出错误的方法是 me
我正在实现一个“小”客户端/服务器应用程序,例如云。问题是:我是 Java 新手。所以我学得有点快,客户端/服务器通信、数据库、框架、线程也是如此。 我很确定我的代码不会是最好的,但事实是:我必须使用
是否有一个 FILE (fopen?) 函数可以让我从二进制文件中读取一个整数? 到目前为止我正在尝试这个,但是我遇到了某种我看不到的错误,因为程序在没有告诉我的情况下崩溃了。 void opente
在Console.scala我们有很好的方法,例如 readInt、readChar 等。 为什么我们不为 io.Source 提供它们?如果您认为我们应该使用 Java 的 IO 功能,那么为什么要
(请原谅我,因为我不经常用 Java 编写。) 我正在用 Java 编写一个客户端网络应用程序,我遇到了一个有趣的问题。每次调用 readInt() 都会抛出一个 EOFException。变量的类型
我们的应用程序中有一个问题可以简化为以下代码: public static void main(String[] args) throws IOException, ClassNotFoundExce
一方面,我有一个 Java 客户端将整数写入其输出流: int a = 20; dataout.writeInt(a); dataout.flush(); 从另一端我有一个 C 服务器监听连接: in
我是一名优秀的程序员,十分优秀!