Example #1
0
AsnLen AsnBits::EncodeWithSizeConstraint (AsnBufBits &b)const
{
	AsnLen len = 0;
    int numSizeConstraints;
    const SizeConstraint* sizeConstraints = SizeConstraints(numSizeConstraints);
	int iSCLowerBound = sizeConstraints[0].lowerBound;
	int iSCUpperBound = iSCLowerBound;
	int minBitsNeeded = 0;
	int minBytesNeeded = 0;
	long Range = FindSizeConstraintBounds(iSCLowerBound, iSCUpperBound);
	long tempRange = Range - 1;
	long size = bitLen;
	unsigned char* temp = NULL;
	long tempLength = 0;
	unsigned char* pStr = new unsigned char[1];

	while(tempRange > 0)
	{
		tempRange -= (long)(1 << minBitsNeeded);
		minBitsNeeded += 1;
	}

	if(Range > 1)
	{
		if( (iSCUpperBound > 16) && b.IsAligned())
		{
			len += b.OctetAlignWrite();
		}

        if(size > iSCUpperBound)
        {
            size = iSCUpperBound;
        }

        if(size < iSCLowerBound)
        {
            size = iSCLowerBound;
        }

		minBytesNeeded = minBitsNeeded / 8;
		minBitsNeeded = minBitsNeeded % 8;
		size -= iSCLowerBound;

		if(minBytesNeeded > 0)
		{
			pStr[0] = (unsigned char)(size >> minBitsNeeded);
			len += b.PutBits(pStr, 8);
		}

		pStr[0] = (unsigned char)size;
		pStr[0] <<= 8 - minBitsNeeded;
		len += b.PutBits(pStr, minBitsNeeded);
	}
Example #2
0
AsnLen AsnString::EncodeWithSizeConstraint(AsnBufBits &b)const
{
    FUNC("AsnString::EncodeWithSizeConstraint");

    AsnLen len = 0;
    int B = numBits();
    int B2 = findB2(B);
    int numSizeConstraints;
    const SizeConstraint* sizeConstraints = SizeConstraints(numSizeConstraints);
    int iSCLowerBound = sizeConstraints[0].lowerBound;
    int iSCUpperBound = iSCLowerBound;
    int minBitsNeeded = 0;
    int minBytesNeeded = 0;
    long Range = FindSizeConstraintBounds(iSCLowerBound, iSCUpperBound);
    long tempRange = Range - 1;
    long size = length();
    long count = 0;
    unsigned char* pStr = new unsigned char[1];

    while(tempRange > 0)
    {
        tempRange -= (long)(1 << minBitsNeeded);
        minBitsNeeded += 1;
    }

    if(size < iSCLowerBound || size > iSCUpperBound)
    {
        delete [] pStr;
        throw EXCEPT("String size not withing restricted bounds", RESTRICTED_TYPE_ERROR);
    }


    if(Range > 1)
    {
        if( ((iSCUpperBound * B2) > 16) && b.IsAligned())
        {
            len += b.OctetAlignWrite();
        }

        minBytesNeeded = minBitsNeeded / 8;
        minBitsNeeded = minBitsNeeded % 8;
        size -= iSCLowerBound;

        if(minBytesNeeded > 0)
        {
            pStr[0] = (unsigned char)(size >> minBitsNeeded);
            len += b.PutBits(pStr, 8);
        }

        pStr[0] = (unsigned char)size;
        pStr[0] <<= 8 - minBitsNeeded;
        len += b.PutBits(pStr, minBitsNeeded);
    }