Jakie jest rozumowanie nie ma małych typów skalarnych w buforach protokołu Google?

https://developers.google.com/protocol-buffer/docs/proto#scalar.

Dokładniej dla C ++, czy przeniesienie uint16_t jako dwa bytes w GPB? Patrzę na konwersję istniejącego protokołu opartego na wiadomości do GPB, a to wydaje mi się trochę dziwne.

0
Martin G 17 luty 2017, 13:36

2 odpowiedzi

Najlepsza odpowiedź

GBP wykorzystuje kodowanie o zmiennej długości, co oznacza, że rozmiar transmisji całkowitej zależy od wartości całkowitej. Małe ints zostaną wysłane przy użyciu tylko kilku bajtów.
Oto link do przewodnika o Kodowanie GBP

W szczególności, jeśli masz tylko jeden konkretny przypadek krótkiej int (i niewielu z nich, w którym to przypadku prawdopodobnie będziesz chciał użyć bytes), powinieneś po prostu rzucić wszystkie uint16_t do uint16_t {X2}} i pozwól różnorodom robić rzeczy.

1
SRLKilling 17 luty 2017, 11:17

Kodowanie typu Scalar ProtoBUF wykorzystuje zmienną liczbę bajtów:

  • 1 bajt, jeśli <2 ** (8-1) = 128
  • 2 bajty, jeśli <2 ** (16-2) = 16384
  • 3 bajty, jeśli <2 ** (24-3) = 2097152
  • 4 bajty, jeśli <2 ** (32-4) = 268435456 itp.

Więc chociaż może to zabijać cię jako space-Savvy C Coder, uint_16t przyjmuje najwyżej 2 bajty tylko dla najniższych 1/4 zakresu.

PB jest ostatecznie zaprojektowany do kompatybilności do przodu, a Google wie, że krótkie stałe typy danych będzie zawsze okazać się zbyt krótki :-) (Y2K, IPv4, nadchodzącego czasu 2038 UNIX itp.) Jeśli naprawdę jesteś , strasznie po zwartości, użyj bytes, jak zalecane @srlkilling, na koszt potrzeby napisania własnego kodeka na nim.

1
Pavel Zdenek 18 luty 2017, 21:15