java - 在套接字传输中将 ASCII 与二进制分开

标签 java inputstream

我必须解码包含文件片段的套接字传输:

data %filekey% [3:%piece3% 5:%piece5% 7:%piece7% 8:%piece8% 9:%piece9%]
  • %pieceN% 包含文件的第 N 个二进制片段
  • 碎片的长度已知
  • %filekey% 已知
  • 索引已知(但顺序可能不正确)
  • 除了片段之外的所有内容都是 ASCII
  • 此消息以回车符结束 (\n)。
  • 此“协议(protocol)”无法更改。

我面临两个问题:

  • 我可以从我的 InputStream 中提取该行,寻找 \n。但是,如果 %pieceN% 中的一个字节还包含回车符怎么办?
  • 要分割每个部分及其相应的索引,我必须找到N:。就像我之前的问题:如果 %pieceN% 包含 : 会怎样?

最佳答案

既然你知道data %filekey% [3:%piece3% 5:%piece5% 7:%piece7% 8:%piece8% 9:%piece9%]的每个部分的长度 - 你知道空格的数量,你知道%filekey% 是什么,你知道每个%pieceN% 的长度,等等 - 这意味着你知道data %filekey的完整长度% [3:%piece3% 5:%piece5% 7:%piece7% 8:%piece8% 9:%piece9%],所以你可以直接使用 java.io.InputStream.read(byte[]).read(byte[], int, int)读取您需要的确切字节数。 (注意,这些方法都返回一个 int 来指示它们实际读取的字节数。您可能需要在循环中调用它们以确保填充字节数组。)不必担心搜索 \n

关于java - 在套接字传输中将 ASCII 与二进制分开,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9485098/

相关文章:

java - AudioSystem.getInputStream(InputStream) 异常

java - 从 JodaTime 获取友好、口语化的字符串

java - 将字符串转换为日历。最简单的方法是什么?

java - java8中如何在LocalDateTime、ZonedDateTime等类中选择Date/Time类?

java - 如何设置要读入 GUI 中文本字段的某些文本?

java - 我想模拟一个扩展InputStream的专有类,模拟读取,验证关闭

java - 如何在 Google App Engine (JAVA) 中写入控制台?

java - 有没有一种方法可以仅使用一种方法对 FXML 文件对象做出不同的响应?

java - 无法存储 ReadLine (bufferedReader) 中的值

java - 将操作系统从 linux 更改为 windows 时的 InputStream 空指针