Add a toInt() method that correctly adjusts for the signedness bit even on

different variable sized byte vectors.


git-svn-id: svn://anonsvn.kde.org/home/kde/trunk/kdesupport/taglib@306690 283d02a7-25f6-0310-bc7c-ecb5cbfe19da
This commit is contained in:
Scott Wheeler 2004-04-26 23:00:21 +00:00
parent 8c2b1138ea
commit 31b46c03ac
2 changed files with 35 additions and 0 deletions

View File

@ -483,6 +483,26 @@ TagLib::uint ByteVector::toUInt(bool mostSignificantByteFirst) const
return sum;
}
int ByteVector::toInt(bool mostSignificantByteFirst) const
{
int sum = 0;
int last = d->data.size() > 4 ? 3 : d->data.size() - 1;
bool negative = uchar(d->data[mostSignificantByteFirst ? 0 : last]) & 0x80;
if(negative) {
for(int i = 0; i <= last; i++)
sum |= uchar(d->data[i] ^ 0xff) << ((mostSignificantByteFirst ? last - i : i) * 8);
sum = (sum + 1) * -1;
}
else {
for(int i = 0; i <= last; i++)
sum |= uchar(d->data[i]) << ((mostSignificantByteFirst ? last - i : i) * 8);
}
return sum;
}
long long ByteVector::toLongLong(bool mostSignificantByteFirst) const
{
// Just do all of the bit operations on the unsigned value and use an implicit

View File

@ -243,6 +243,21 @@ namespace TagLib {
*/
uint toUInt(bool mostSignificantByteFirst = true) const;
/*!
* Converts the first 4 bytes of the vector to an integer.
*
* If \a mostSignificantByteFirst is true this will operate left to right
* evaluating the integer. For example if \a mostSignificantByteFirst is
* true then $00 $00 $00 $01 == 0x00000001 == 1, if false, $01 00 00 00 ==
* 0x01000000 == 1.
*
* This will correctly adjust for the bit indicated signedness being the most
* significant bit of the most significant byte.
*
* \see fromUInt()
*/
int toInt(bool mostSignificantByteFirst = true) const;
/*!
* Converts the first 8 bytes of the vector to a (signed) long long.