【问题标题】:bytes from network to String从网络到字符串的字节
【发布时间】: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


【解决方案1】:

我的问题是:我可以直接从 byte [] 数组并使用正则表达式检查消息是否正确 建好了吗?

是的,你可以,String 类有一个构造函数,它接受 byte [] 然后应用适当的正则表达式来检查消息是否有效

其他问题是:我可以制作一个包含我的消息的字符串,并使用 String.getBytes() 通过网络发送一个字节数组[]?

是的,如果你想知道如何通过网络发送文件字节look this

【讨论】:

  • 是的,我知道如何做这些事情,我不是在问代码,我在问这是否是正确的方法?不过谢谢你的回答
  • 如果你得到一个 0x10 0x09 0x01 字节会发生什么?然后,直接从字节转换为字符串,而不对 charset 做任何假设?这可能有效也可能无效,具体取决于输入。
猜你喜欢
  • 2016-10-26
  • 2014-04-07
  • 2016-03-28
  • 1970-01-01
  • 2021-03-27
  • 1970-01-01
  • 1970-01-01
  • 2016-08-28
  • 1970-01-01
相关资源
最近更新 更多