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 CObjectOStreamAsn::WriteBitString(const CBitString& obj) { static const char ToHex[] = "0123456789ABCDEF"; bool hex = obj.size()%8 == 0; m_Output.PutChar('\''); #if BITSTRING_AS_VECTOR // CBitString is vector<bool> if (hex) { Uint1 data, mask; for ( CBitString::const_iterator i = obj.begin(); i != obj.end(); ) { for (data=0, mask=0x8; mask!=0; mask >>= 1, ++i) { if (*i) { data |= mask; } } m_Output.WrapAt(78, false); m_Output.PutChar(ToHex[data]); } } else {
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)); } } } }