2016-11-30 212 views
2

我想用Thrift發送1024字節的數據。它必須是1024字節,因爲它是與其他框架的比較基準。Apache Thrift:字節和二進制類型之間的區別

Thrift有兩種類型來表示字節:「字節」和「二進制」,但我不知道如何使用這些類型。 'binary'類型被映射到std :: string,這很奇怪(我不明白爲什麼以及如何使用它)。 '字節'類型被映射到一個8位整數,這對我來說似乎更合乎邏輯。

爲了表示1024個字節的數據,我用:list<byte> byteSequence尺寸爲1024

但編譯警告,建議我使用binary代替list<byte>,但是爲什麼呢?如何 ?

我想我會得到更好的性能與'二進制',因爲它是奇怪的緩慢與1024字節序列。

謝謝。

回答

1

它可能取決於你將編譯你的節儉文件的語言,但binary直接告訴節儉,你確實想傳輸一系列未經編碼的原始字節。

它在傳輸層的尺寸方面可能沒有太大的改變,但是當你用你選擇的語言對對象進行實例化/反序列化時,你可能會遇到驚喜。例如,在Java中,binary字段將用byte[]表示,而list[byte]會給出List[Byte],這對於表示同樣的事情效率要低得多。

爪哇可能是唯一的原因binary,作爲根據thrift doc

二進制:未編碼的字節序列

NB:這是目前串的一種特殊形式以上類型添加了以提供與Java更好的互操作性。目前的記錄計劃是在某種程度上將其提升到基本類型。

+0

我使用C++編譯。如果我理解得很好,那麼在C++中使用list [byte]或binary之間不會有性能差異?我想嘗試自己,但我不明白如何在C++中使用二進制類型,因爲它映射到std :: string。我如何用std :: string表示1024個字節的數據? –

+1

我不是C++專家,但從谷歌搜索似乎std ::字符串是持有和操縱二進制數據罰款。例如:http://stackoverflow.com/a/837528/1997056 – Shastick

+0

好吧,所以我嘗試:字符串序列; for(int j = 0; j <1024; j ++)sequence + =(char)0;我的表現更好。我希望這種方法很好。感謝您的幫助。 –

3

但編譯警告建議我使用二進制而不是列表,但爲什麼?如何 ?

'字節'類型映射到一個8位整數,這對我來說似乎更符合邏輯。

而這正是警告出現的原因。這似乎是合乎邏輯的,但這是最糟糕的選擇。此外,在Thrift的byte實際上是一個i8 - 一個簽署類型。

'binary'類型映射到std :: string,這很奇怪(我不明白爲什麼)。

別擔心。這是一個歷史的事情。 binary類型稍後添加並在某些方面實現類似於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 
} 
+0

謝謝你的解釋。當我說「我不知道如何使用它」時,我的意思是我不知道如何用一個字符串正好表示1024個字節。我這樣做了:字符串序列; for(int j = 0; j <1024; j ++)sequence + =(char)0;但我真的不知道這是否是一個好方法。 –

+0

'std :: string()'有一些有用的CTOR,參見[這個答案](http://stackoverflow.com/a/166646/499466)。像放置例如字母'A'的1024倍應該做的伎倆。 – JensG

相關問題