diff --git a/taglib/toolkit/tbytevector.cpp b/taglib/toolkit/tbytevector.cpp index 31e11d65..5fc6ded5 100644 --- a/taglib/toolkit/tbytevector.cpp +++ b/taglib/toolkit/tbytevector.cpp @@ -208,22 +208,21 @@ T toNumber(const ByteVector &v, bool mostSignificantByteFirst) return 0; } - const size_t size = sizeof(T); - - if(v.size() >= size) - { + if(v.size() >= sizeof(T)) { if(isLittleEndianSystem == mostSignificantByteFirst) return byteSwap(*reinterpret_cast(v.data())); else return *reinterpret_cast(v.data()); } + else { + T sum = 0; + for(size_t i = 0; i < v.size(); i++) { + const size_t shift = (mostSignificantByteFirst ? v.size() - 1 - i : i) * 8; + sum |= static_cast(static_cast(v[i]) << shift); + } - const uint last = std::min(v.size() - 1, size); - T sum = 0; - for(uint i = 0; i <= last; i++) - sum |= (T) uchar(v[i]) << ((mostSignificantByteFirst ? last - i : i) * 8); - - return sum; + return sum; + } } template