2016-04-04 35 views
0

Vektörün boyutunu tamponda eklemek istiyorum. Ama boyutun ne olduğunu tam olarak bilmiyorum. Sonuçta, std :: size_t sabit bir boyutta olamaz. Aklımda, yerine uint64_t kullanmayı düşünüyorum. Ardından tampon bu istiyorum: Bir seri arabelleğe serileştirme vektörü <int32_t> hakkında mı?

8 bytes length | 4 bytes element1 | 4 bytes element2 | ... | 

Şimdi soru uint64_t std :: size_t anlamına gelmez olduğunu. Daha iyi bir fikir takdir edilecektir.

+1

Ben ne istediğini anlamıyorum. Dört bayt veya sekiz bayt veya belirli bir endianness veya formatta boyutu kodlamak için ne kullanırsanız kullanın, o zaman sadece bunu yapın. Sorun nedir? Boyutu tutmak için 'size_t' kullanabilirsiniz - boyutunu tutabildiği sürece ne tür bir kullanım yaptığınız fark nedir? –

+0

Ayrıca, taşınabilir olmak için, öngörülebilir endianiteye sahip olduğunuzdan emin olun, örn. sokete göndermeden önce 32 bit varlıklar için htonl() kullanın. –

+0

@David Schwartz Soru şu ki, vektörün büyüklüğünün ne olduğunu bilmiyorum. Bu boyutu tutmak için bir uint64_t değişkeni kullanamam ve bu değişkeni arabelleğe yazamam. – NiklausTseng

cevap

1

Kullandığınız değeri tutabildiği sürece istediğiniz türde kullanabilirsiniz. Zaten bir size_t olduğundan, sadece bu şekilde devam edin. Değeri temsil etmek istediğiniz kaç baytı ve her baytı hangi değere ihtiyaç duyduğunuza karar verin ve her baytı doğru şekilde kodlamak/kod çözmek için kod yazın.

+0

Şunu söylemek üzereydim: "Bu korkunç bir fikir. Size_t büyük ihtimalle 64 bit. Küçük ARM işlemcimdeki size_t 32 bit. Sanırım siz de 16 bit'lik size_t boyutunda cihazlar alabilirsiniz." Ama yanlış anladım. "Use_t" ifadesini kullanmalısınız, ancak TCP arabelleğine kaydeddiğinizde 8 sekizli olarak kodlayın (eğer size_t 32 bit ise, oktetlerin 4'ü sıfır olarak sonlandırılacaktır). - Kabul. –

1

Neredeyse varsınız. Mevcut bir platformda, 64 bitden fazla olmayan size_t boyutu kullanılmaz (ve deneysel 100TBit fiber üzerinden 64 bit'lik int32 değerini aktarması birkaç gün sürer). adımlar şunlardır:

  1. const uint64_t len = vec.length();
  2. tanımlanmış bir sırayla tcp tamponu içine sekiz bayt yaz.
  3. Her int'nin dört baytını, tanımlanan bir sırada tcp arabelleğine yazın.
  4. Gönder. Son iki basamak birkaç bin elemanlar daha fazlası için bir döngü içinde olmak zorunda olacağı

Not ..