【发布时间】:2017-05-26 13:23:45
【问题描述】:
我有一个学校任务,我必须通过网络制作应用程序。我们可以使用 Java 或 C(或两者)来完成。 我们已经获得了在计算机之间进行通信的精确协议。 这是该协议的消息示例:
[REGIS␣id␣port␣pass+++]
在此消息中,id 必须恰好在 8 个字节上,端口在 4 个字节上,传递在 2 个字节上,REGIS 在 5 个字节上,+++ 在 3 个字节上。 为了阅读这条消息,我使用了 InputStream 对象和 read() 方法,所以我得到了一个 byte[] 数组。
我的问题是:我可以直接从 byte [] 数组构造一个 String 对象并使用正则表达式来检查消息是否正确构造?
另一个问题是:我可以制作一个包含我的消息的字符串,并使用 String.getBytes() 通过网络发送一个字节数组 [] 吗?
我关心的是编码:我确定它会为每个字符生成 1 个字节吗?如果消息被 C 程序读取,我不会有问题吗?
感谢您的帮助!
【问题讨论】:
-
“我可以直接从 byte [] 数组构造一个 String 对象吗”——实际上有一个构造函数。你有没有尝试过?
-
是的,我知道有一个构造函数,我的问题是:我可以这样做并确保我在转换之间仍然有正确的字节数吗?
-
正则表达式适用于字符串,它由字符组成,而不是字节。所有字节序列都不是有效的字符串,字节如何转换为字符取决于所选的字符集(也称为编码)。为什么不只读取您期望的字节数(22)?如果您读取 22 个字节,您怎么知道消息是无效的,因为您对字节的大小没有任何限制?我看到的唯一无效情况是:1.您收到少于 22 个字节,然后套接字关闭; 2.你应该收到N条消息,但收到的字节数不是22的倍数。
-
将字节视为字符而不精确指定字节如何映射到字符(字符集)充其量是狡猾的。鉴于您的“协议”规范不完整。如果没有您可能遗漏的其他信息(例如关于编码的通用前言章节),则没有规范的方式来解释此规范。
-
id、port 和 pass 是以二进制形式发送还是以文本形式发送?
标签: java byte inputstream