diff --git a/src/bitmask.cpp b/src/bitmask.cpp index 4895b23..2e67953 100644 --- a/src/bitmask.cpp +++ b/src/bitmask.cpp @@ -105,9 +105,24 @@ namespace impl { PVXS_API void to_wire(Buffer& buf, const BitMask& mask) { - size_t nbytes = (mask.size() + 7u)/8u; // round up #bits to bytes - size_t nwords = nbytes / 8u; - size_t extra = nbytes % 8u; // trailing single bytes + // ignore trailing zeros + size_t nwords=mask.wsize(); + size_t extra = 0u; + while(nwords) { + auto last = mask.word(nwords-1u); + if(last&0xff00000000000000ull) break; + nwords--; + if(last==0) continue; + else if(last&0x00ff000000000000ull) extra=7u; + else if(last&0x0000ff0000000000ull) extra=6u; + else if(last&0x000000ff00000000ull) extra=5u; + else if(last&0x00000000ff000000ull) extra=4u; + else if(last&0x0000000000ff0000ull) extra=3u; + else if(last&0x000000000000ff00ull) extra=2u; + else if(last&0x00000000000000ffull) extra=1u; + break; + } + size_t nbytes = nwords*8u + extra; to_wire(buf, Size{nbytes}); for(auto i : range(nwords)) { diff --git a/src/pvxs/bitmask.h b/src/pvxs/bitmask.h index 75f95f6..8f3fdea 100644 --- a/src/pvxs/bitmask.h +++ b/src/pvxs/bitmask.h @@ -120,7 +120,7 @@ public: //! number of bits inline size_t size() const { return _size; } //! size()==0 - inline bool empty() const { return _words.empty(); } + inline bool empty() const { return _size==0u; } //! number of storage words inline size_t wsize() const { return _words.size(); } diff --git a/test/testbitmask.cpp b/test/testbitmask.cpp index 692da05..663c08a 100644 --- a/test/testbitmask.cpp +++ b/test/testbitmask.cpp @@ -121,13 +121,13 @@ void testExpr() } template -void testSerCase(bool be, uint8_t(&actual)[N], const char *expect) +void testSerCase(bool be, uint8_t(&input)[N], const char *expect) { - std::string sactual((char*)actual, N-1u); - testShow()<<__func__<<"("<<(be?"BE":"LE")<<", \""<