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

Java 在套接字传输中将ASCII与二进制分开,java,inputstream,Java,Inputstream,我必须解码包含文件片段的套接字传输: data %filekey% [3:%piece3% 5:%piece5% 7:%piece7% 8:%piece8% 9:%piece9%] %pieceN%包含文件的第N个二进制片段 工件的长度是已知的 %filekey%已知 索引是已知的(但顺序可能不正确) 除了片段之外,其他都是ASCII码 此消息以回车结束(\n) 这个“协议”不能改变 我面临两个问题: 我可以从我的输入流中提取行,查找\n。但是如果%pieceN%中的一个字节也包含回车怎

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

data %filekey% [3:%piece3% 5:%piece5% 7:%piece7% 8:%piece8% 9:%piece9%]
  • %pieceN%
    包含文件的第N个二进制片段
  • 工件的长度是已知的
  • %filekey%
    已知
  • 索引是已知的(但顺序可能不正确)
  • 除了片段之外,其他都是ASCII码
  • 此消息以回车结束(
    \n
  • 这个“协议”不能改变
我面临两个问题:

  • 我可以从我的
    输入流
    中提取行,查找
    \n
    。但是如果
    %pieceN%
    中的一个字节也包含回车怎么办
  • 要分割每个片段及其对应的索引,我必须找到
    N:
    。就像我前面的问题一样:如果
    %pieceN%
    包含一个

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

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

,因为JB Nizet说协议不完整。为了使协议完整,它需要允许转义用于分隔数据的任何字符。这些
%pieceN%
有多任意?你知道它们预计会有多长吗?对它们的内容有任何限制吗嘿,可以吗?@ruakh:我根据你的需要编辑了我的问题。
]
本身?它可以是一行的终止符,而不是
\n
@eee正如我所说,我不能修改协议。消息结尾=
\n
。正如JB Nizet所说,协议不完整。为了使它完整,它需要允许转义用于分隔数据的任何字符。这些
%pi有多任意eceN%
s?你知道它们预计会持续多长时间吗?它们的长度有任何限制吗?@ruakh:我根据你的需要编辑了我的问题。
]
本身如何?它可以是一行的终止符,而不是
\n
@eee正如我所说的,我不能修改协议。消息结束=
\n
。我也可以吗假设ASCII字符是8位长度?@IDIQAL:这是由协议决定的,但是--是的,几乎可以肯定。我是否假设ASCII字符是8位长度?@IDIQAL:这是由协议决定的,但是--是的,几乎可以肯定。