void CObjectIStreamJson::ReadBitString(CBitString& obj) { #if BITSTRING_AS_VECTOR ThrowError(fNotImplemented, "Not Implemented"); #else if (TopFrame().HasMemberId() && TopFrame().GetMemberId().IsCompressed()) { ThrowError(fNotImplemented, "Not Implemented"); return; } Expect('\"'); obj.clear(); obj.resize(0); CBitString::size_type len = 0; for ( ;; ++len) { char c = GetChar(); if (c == '1') { obj.resize(len+1); obj.set_bit(len); } else if (c != '0') { if ( c != 'B' ) { ThrowError(fFormatError, "invalid char in bit string"); } break; } } obj.resize(len); Expect('\"'); #endif }
void CObjectIStreamAsn::ReadBitString(CBitString& obj) { obj.clear(); #if BITSTRING_AS_VECTOR // CBitString is vector<bool> Expect('\'', true); string data; size_t reserve; const size_t step=128; data.reserve(reserve=step); bool hex=false; int c; for ( ; !hex; hex= c > 0x1) { c = GetHexChar(); if (c < 0) { break; } data.append(1, char(c)); if (--reserve == 0) { data.reserve(data.size() + (reserve=step)); } } if (c<0 && !hex) { hex = m_Input.PeekChar() == 'H'; } if (hex) { obj.reserve( data.size() * 4 ); Uint1 byte; ITERATE( string, i, data) { byte = *i; for (Uint1 mask= 0x8; mask != 0; mask >>= 1) { obj.push_back( (byte & mask) != 0 ); } } if (c > 0) { obj.reserve(obj.size() + (reserve=step)); for (c= GetHexChar(); c >= 0; c= GetHexChar()) { byte = c; for (Uint1 mask= 0x8; mask != 0; mask >>= 1) { obj.push_back( (byte & mask) != 0 ); if (--reserve == 0) { obj.reserve(obj.size() + (reserve=step)); } } } }