diff --git a/toolkit/tbytevector.cpp b/toolkit/tbytevector.cpp index 5a27c60c..59d1648e 100644 --- a/toolkit/tbytevector.cpp +++ b/toolkit/tbytevector.cpp @@ -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 diff --git a/toolkit/tbytevector.h b/toolkit/tbytevector.h index 8a7b8cfd..afe3c162 100644 --- a/toolkit/tbytevector.h +++ b/toolkit/tbytevector.h @@ -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.