我的目标是对客户端通过WebSocket连接发送到服务器的消息进行解码。帧数据具有长度,更多基于基本帧协议[RFC6455]。
我最近发现read(byte[]b)
输出整个帧。
例如,当客户端向服务器发送消息时
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而不是byte?
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);
}
我最近想知道像InputStream int read(byte[]b)方法这样的函数是如何工作的。我知道Java总是通过值传递方法参数,而不是通过引用。 知道了这一点,我不理解在将空字节数组传递给read方法(假设InputStream中有要读取的字节)后,它如何包含值。据我所知,只有传递给read方法的值会在内部被触摸,唯一的输出应该是read字节数(整数返回值)。但字节数组仍然以某种方式填充
描述 (Description) java.util.zip.ZipInputStream.read(byte[] buf, int off, int len)方法从当前ZIP条目读入字节数组。 如果len不为零,则该方法将阻塞,直到某些输入可用为止; 否则,不读取任何字节,返回0。 声明 (Declaration) 以下是java.util.zip.ZipInputStream.read(byt
描述 (Description) java.util.zip.InflaterInputStream.read(byte[] buf, int off, int len)方法将未压缩的数据读入字节数组。 如果len不为零,则该方法将阻塞,直到某些输入可以解压缩; 否则,不读取任何字节,返回0。 声明 (Declaration) 以下是java.util.zip.InflaterInputStrea
描述 (Description) java.util.zip.DeflaterInputStream.read(byte[] b, int off, int len)方法从输入流中读取单个字节的压缩数据。 此方法将阻塞,直到可以读取和压缩某些输入。 声明 (Declaration) 以下是java.util.zip.DeflaterInputStream.read(byte[] b, int of
我知道byte不是一个合适的类型,不足以包含read方法的结果。 所以,read方法返回int类型值。 但我认为短类型比int更有效。 它可以包含范围-256~255的值。 为什么read方法返回int而不是short?
问题内容: 为什么经常的输出与如此不同?是的简写。大多数情况下,仅使用会给我相同的结果,但似乎可以解决问题。我想知道输出是否正确甚至是偶数,我想要哪些数字?(即实际文件大小,如果复制到另一个存储设备) 问题答案: 表观大小 是应用程序认为在文件中的字节数。如果您决定通过FTP或HTTP发送文件,则为通过网络传输的数据量(不计算协议标头)。这也是的结果,以及如果使用加载整个文件,文件将占用的地址空间