【问题标题】:How to Read Byte Stream from Socket [duplicate]如何从套接字读取字节流 [重复]
【发布时间】:2016-06-28 03:34:22
【问题描述】:

下面是我的字节流的快照,前 4 个字节是幻数,接下来的两个字节是有效载荷的长度,其余的是有效载荷。

如何读取这个字节流? 编码为“UTF-16BE”

01:0c:00:00:01:08:00:2f:00:75:00:74:00:69:00:6c:00:69:00:74:00:69:00:65:00:73:00:2f:00:65:00:6c:00:65:00:63:00:74:00:72:00:69:00:63:00:69:00:74:00:79:00:2f:00:7a:00:5f:00:37:00:30:00:62:00:33:00:64:00:35:00:31...More bytes

【问题讨论】:

  • 我在您的previous post 中为您回答了这个问题,并提供了比您接受的更好的解决方案。

标签: java sockets


【解决方案1】:

我会这样:

1) 有一种方法可以从流中读取预设数量的字节:

private byte[] read(int size) throws IOException {
    byte[] result=new byte[size];
    for (int index=0;index<size;index++) {
        result[index]=in.readByte();
    }
    return result;
}

2) 您将需要一种方法来重建 2 个字节的长度标记 - 我在这里假设 PC 字节顺序,即 LSB - MSB:

private int byteArrayToWord(byte[] value) {
    int ret = ((value[0] & 0xFF) ) | ((value[1] & 0xFF) << 8);

    return ret;
}

3) 然后把你的东西读成:

byte[] magic=read(4);
int len=byteArrayToWord(read(2));

String response=new String(read(len),StandardCharsets.UTF_16); // check the actual charset

注意字符串构造函数,它允许您使用给定的编码从字节数组创建字符串。这是我猜唯一真正棘手的部分:)

【讨论】:

  • 都是多余的。 DataInputStream 已经完成了这一切。
  • @EJP,我不这么认为。 DataInputStream 不允许您处理 word 和 int 值的不同字节顺序,DataInputStream 不允许您以任意编码读取 String。
  • 查看副本。 OP 正在使用 big-endian,他应该这样做,这是网络上的标准,以及 DataInputtStream 实现的内容。
  • 嗯,应该,标准是有弹性的。 OP 没有说明幻数的字节顺序,也没有说明长度标志的字节顺序——我认为它是 PC 顺序的。可能存在字节顺序不受我们控制的情况。例如,假设一个嵌入式 8 位处理器向网络发送一些东西。字节顺序是完全任意的,因为无论如何它都是以字节为单位的。我发现依赖隐式转换(例如 DataInputStream readInt 需要特定的字节顺序)会让人感到意外。
  • 为了记录,一周前我刚刚遇到了自己的一系列惊喜,当时我解决了同样的问题,遇到了同样的问题。
猜你喜欢
  • 2020-10-20
  • 1970-01-01
  • 1970-01-01
  • 2015-09-01
  • 2012-01-30
  • 2013-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多