in simulation/src/lte/model/lte-asn1-header.cc [89:170]
void Asn1Header::SerializeBitset (std::bitset<N> data) const
{
size_t dataSize = data.size ();
uint8_t pendingBits = dataSize;
uint8_t mask = 1;
int j;
// No extension marker (Clause 16.7 ITU-T X.691),
// as 3GPP TS 36.331 does not use it in its IE's.
// Clause 16.8 ITU-T X.691
if (dataSize == 0)
{
return;
}
// Clause 16.9 ITU-T X.691
// Clause 16.10 ITU-T X.691
if (dataSize <= 65536)
{
// If there are bits pending to be processed,
// append first bits in data to complete an octet.
if (m_numSerializationPendingBits > 0)
{
mask = 0x80 >> m_numSerializationPendingBits;
while (pendingBits > 0 && m_numSerializationPendingBits < 8)
{
m_serializationPendingBits |= (data[pendingBits - 1]) ? mask : 0;
pendingBits--;
m_numSerializationPendingBits++;
mask = (mask >> 1) & (~mask);
}
if (m_numSerializationPendingBits >= 8)
{
WriteOctet (m_serializationPendingBits);
m_numSerializationPendingBits = 0;
m_serializationPendingBits = 0;
}
}
while (pendingBits > 0)
{
mask = 1;
j = 8;
// If there are less than 8 remaining bits,
// store it to m_serializationPendingBits.
if (pendingBits < 8)
{
mask = 0x80;
m_numSerializationPendingBits = pendingBits;
while (pendingBits > 0)
{
m_serializationPendingBits |= (data[pendingBits - 1]) ? mask : 0;
mask = (mask >> 1) & (~mask);
pendingBits--;
}
}
// Write the data to buffer
else
{
uint8_t octetToWrite = 0;
for (; j > 0; j--)
{
octetToWrite |= (data[pendingBits - j]) ? mask : 0;
mask = (mask << 1) & (~mask);
}
WriteOctet (octetToWrite);
pendingBits -= 8;
}
}
}
// Clause 16.11 ITU-T X.691
else
{
printf ("FRAGMENTATION NEEDED!\n");
}
}