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); }
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); }