【问题标题】:Byte (or bit) sequences in Java and KotlinJava 和 Kotlin 中的字节(或位)序列
【发布时间】:2019-04-06 14:42:00
【问题描述】:

是否有一种规范的方式来定义 Java(以及 Kotlin 扩展)中的数据结构,该数据结构可以按照结构中定义的字节顺序序列化为字节数组或位序列?

类似于 C 中的结构体。

编辑:因此,除此之外,我想要一种简单而富有表现力的方式来定义数据结构,然后访问它的任何部分。因此,例如,在伪代码中:

DataStructure Message {
    Bit newFlag;
    Bit genderFlag;
    Bit sizeFlag;
    Bit activeFlag;
    Bit[4] operation;
    Byte messageSize;
    Byte[] message; 
}

那么我们就这样做:

Message firstMessage = new Message(1, 0, 1, 0, b'0010', 11, "Hello there");

我们可以说:

ByteArray serialisedMessage = firstMessage.toBytes();

这会给我们一个看起来像这样的数组:

[b'10100010', b'00001011', "Hello there" (but in bytes)]

那么我们可以这样做:

firstMessage.genderFlag = 1;

..然后在对象上重新运行 .toBytes。

显然,在 Java 中有上百万种类似的方法,但据我所知,语法上没有什么简单的 - 几乎任何事情都需要编写自定义序列化(而不是每个对象的对象序列化)方法。也许这是执行此操作的规范方法,但如果按照 C、Rust 和 erm、COBOL 的方式,让它更简单一些,那就太好了。

【问题讨论】:

  • 它不一定是结构体,但我想在位级数据结构中标记位和字节。
  • 最接近的是序列化或自定义实现
  • 有很多现有的工具来设计可以高效序列化的数据结构,例如developers.google.com/protocol-buffers。没有很多工具可以让您控制确切的序列化结构。

标签: java arrays kotlin bit-manipulation byte


【解决方案1】:

我不知道你的实际问题的答案。

不过,我会就问题本身的性质提出一两个想法。 C 不是作为高级语言开发的——我听说过的最好的描述是“结构化汇编程序”,它具有基于可用寻址模式的运算符 它最初是在 16 位机器上开发的,它不是作为应用程序中使用的标准开发的,而是比汇编程序更容易的东西,它仍然允许程序员有足够的控制权来编写非常高效的代码。用它完成的前两件事是编译器和操作系统,因此运行时效率至关重要(在 70 年代初期),如今只有移动和嵌入式开发人员才能开始欣赏它。

在我看来,“在结构中定义字节的顺序”不是思考 Java 中数据的好方法——程序员不知道也不关心他的对象中字段的顺序存储,或者它们是否被存储——它不是语言定义的一部分。在我看来,任何图书馆或声称这样做的任何东西都必须加入免责声明和/或拥有自己的编译器;虽然我不知道它不能这样做并遵循 Java 规范的任何原因,但我不知道为什么有人会打扰。

所以问问自己为什么要这样做。如果你有一个好的答案,把它放在这里;我很好奇。

【讨论】:

  • 我正在构建要通过原始 TCP 流式传输的数据结构。
  • 有趣。那么,我认为您的问题的答案是“不”。您需要 Java 语言之外的东西来按照您想要的方式定义数据结构。
猜你喜欢
  • 2022-08-23
  • 1970-01-01
  • 2015-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-18
相关资源
最近更新 更多