【问题标题】:Apache Thrift : difference between byte and binary typesApache Thrift:字节和二进制类型之间的区别
【发布时间】:2017-04-14 15:40:31
【问题描述】:

我想使用 Thrift 发送 1024 字节的数据。它必须正好是 1024 字节,因为它是与其他框架的比较基准。

Thrift 有两种类型来表示字节:'byte' 和 'binary',但我不知道如何使用这些类型。 'binary' 类型映射到 std::string 这很奇怪(我不明白为什么以及如何使用它)。 'byte' 类型映射到一个 8 位整数,这对我来说似乎更合乎逻辑。

为了表示 1024 字节的数据,我使用:list<byte> byteSequence,大小为 1024。

但是编译警告建议我使用binary 而不是list<byte>,但为什么呢?如何 ?

我认为使用 'binary' 会获得更好的性能,因为 1024 字节序列的速度非常慢。

谢谢。

【问题讨论】:

    标签: c++ binary byte sequence thrift


    【解决方案1】:

    但是编译警告建议我使用二进制而不是列表,但是为什么呢?以及如何?

    'byte' 类型映射到一个 8 位整数,这对我来说似乎更合乎逻辑。

    这正是出现警告的原因。这似乎合乎逻辑,但却是最糟糕的选择。此外,Thrift 中的 byte 实际上是 i8 - 已签名 类型。

    'binary' 类型被映射到 std::string 这很奇怪(我不明白为什么)。

    别担心。那是历史的事情。 binarytype 是后来添加的,在某些方面与 string 类似,以减少与旧版本的兼容性摩擦。这只是一个 impl 细节。

    但我不知道如何使用这些类型。

    和其他类型一样:

     struct wtf {
       1 : binary foo
       2 : string bar
       3 : byte baz     // i8 is replacing byte to indicate the signedness
       4 : list<byte>   // not recommended, but nevertheless works 
     }
    

    【讨论】:

    • 感谢您的解释。当我说“我不知道如何使用它”时,我的意思是我不知道如何用字符串准确地表示 1024 个字节。我是这样做的:字符串序列; for (int j=0; j
    • std::string() 有一些有用的 CTOR,请参阅 this answer。比如放东西1024 次 letterA 应该可以解决问题。
    【解决方案2】:

    这可能取决于您将 thrift 文件编译成的语言,但binary 直接告诉 thrift 您确实想要传输一系列原始的、未编码的字节。

    它在传输层的大小可能不会有太大变化,但是当您使用所选语言实例化/反序列化对象时,您可能会遇到意外。例如,在 Java 中,binary 字段将用byte[] 表示,而list[byte] 将为您提供List[Byte],表示相同事物的效率要低得多。

    Java 可能是binary 的唯一原因,根据thrift doc

    二进制:未编码的字节序列

    注意:这是目前上述字符串类型的一种特殊形式,添加以提供与 Java 更好的互操作性。当前的记录计划是在某个时候将其提升为基本类型。

    【讨论】:

    • 我正在用 C++ 编译。如果我理解得很好,在 C++ 中使用 list[byte] 或 binary 之间不会有性能差异吗?我想自己尝试一下,但我不明白如何在 C++ 中使用二进制类型,因为它映射到 std::string。如何用 std::string 表示 1024 字节的数据?
    • 我不是 C++ 专家,但从谷歌搜索来看,std::string 似乎适合保存和操作二进制数据。例如:stackoverflow.com/a/837528/1997056
    • 好的,我试试:字符串序列; for (int j=0; j
    • 该评论可能需要修改。 binary 是很长时间以来的基本类型。
    猜你喜欢
    • 2011-12-25
    • 2015-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-05
    • 2013-07-25
    • 2011-05-29
    • 2012-12-09
    相关资源
    最近更新 更多