java - 如果与 `read(byte[] b)` 相比,为什么 java.io.InputStream `read()` 方法输出不同的值?
问题描述
我的目标是解码客户端通过 WebSocket 连接发送到服务器的消息。帧数据有长度,更多关于基本帧协议 [RFC6455]。
我最近发现read(byte[] b)
输出整个帧。
例如,当客户端向abcdef
服务器发送消息时
byte[] frame = new byte[1000]
inputStream.read(frame); // [[-127, -122, -69, -122, 95, -5, -38, -28, 60, -97, -34, -32, 0, 0, ....]
但是,第一个字节应该是129
,第二个字节应该是134
。读取帧的唯一方法是通过循环并使用int[]
而不是byte[]
因为该read()
方法输出int而不是字节?
int[] frame = new frame[1000];
booean close = false;
frame[0] = inputStream.read();
frame[1] = inputStream.read();
int length = frame[1] & 127;
int pointer = 2;
while (!close) {
frame[pointer] = inputStream.read();
if (pointer == length) {
close = true;
}
}
解决方案
-127 '是' 129,即它是 10000001,它是一个数字,取决于它是有符号的还是无符号的。
阅读什么是“2 的补码”?有关带符号二进制数格式的更多详细信息。
因此,您可以在需要时使用 byte[] 并将字节转换为 int,例如
public static void main(String... args) {
byte b = -127;
int i = b & 0xff;
System.out.println("b = " + b + " i = " + i);
}
推荐阅读
- c# - 添加了SharpFont nuget,但未找到对Assembly 的引用
- lisp - Lisp 例程中的多个命令
- python - Pandas:检测并移除异常的低值
- keras - Keras 数据生成器可以从目录中传输 .npy 数组吗?
- python - 无法更新 SciView 图
- javascript - 通过调度触发云杉烤面包机
- java - 如何使用正则表达式java从字符串中提取第一个字母和以下三个数字
- javascript - TypeError:无法读取未定义的属性“地图”,我该如何纠正?
- sql-server - 如何使用 SQL Server 比较两个逗号分隔的字符串列表
- pandas - read_csv pandas,编码问题