Fix TagValue::toInteger() from Latin1/UTF-8 str

This commit is contained in:
Martchus 2017-06-08 00:48:10 +02:00
parent 381d8db895
commit 646fc4d302
3 changed files with 4 additions and 5 deletions

View File

@ -178,7 +178,7 @@ set(META_NO_TIDY ON)
set(META_REQUIRED_CPP_UNIT_VERSION 1.14.0)
# find c++utilities
find_package(c++utilities 4.8.0 REQUIRED)
find_package(c++utilities 4.9.0 REQUIRED)
use_cpp_utilities()
# find 3rd party libraries

View File

@ -170,7 +170,7 @@ int32 TagValue::toInteger() const
case TagTextEncoding::Unspecified:
case TagTextEncoding::Latin1:
case TagTextEncoding::Utf8:
return ConversionUtilities::stringToNumber<int32>(m_ptr.get());
return ConversionUtilities::bufferToNumber<int32>(m_ptr.get(), m_size);
case TagTextEncoding::Utf16LittleEndian:
case TagTextEncoding::Utf16BigEndian:
u16string u16str(reinterpret_cast<char16_t *>(m_ptr.get()), m_size / 2);
@ -181,12 +181,10 @@ int32 TagValue::toInteger() const
case TagDataType::PositionInSet:
case TagDataType::StandardGenreIndex:
if(m_size == sizeof(int32)) {
auto res = *reinterpret_cast<int32 *>(m_ptr.get());
return res;
return *reinterpret_cast<int32 *>(m_ptr.get());
} else {
throw ConversionException("Can not convert assigned data to integer because the data size is not appropriate.");
}
break;
default:
throw ConversionException("Can not convert binary data/picture/time span/date time to integer.");
}

View File

@ -157,6 +157,7 @@ void TagValueTests::testString()
"t\0\xe4\0s\0t\0"s, TagValue("\xfe\xfft\0\xe4\0s\0t\0", 10, TagTextEncoding::Utf16BigEndian).toString(TagTextEncoding::Unspecified));
CPPUNIT_ASSERT_EQUAL_MESSAGE("conversion via c'tor",
"15\xe4"s, TagValue("\xef\xbb\xbf\x31\x35ä", 7, TagTextEncoding::Utf8, TagTextEncoding::Latin1).toString(TagTextEncoding::Unspecified));
CPPUNIT_ASSERT_EQUAL_MESSAGE("conversion to int", -15, TagValue(" - 156", 5, TagTextEncoding::Utf8).toInteger());
CPPUNIT_ASSERT_EQUAL_MESSAGE("conversion to int", 15, TagValue("\0\x31\0\x35", 4, TagTextEncoding::Utf16BigEndian).toInteger());
CPPUNIT_ASSERT_THROW_MESSAGE("failing conversion to int", TagValue("15ä", 4, TagTextEncoding::Utf8).toInteger(), ConversionException);
CPPUNIT_ASSERT_EQUAL_MESSAGE("conversion to pos", PositionInSet(4, 15), TagValue("4 / 15", 6, TagTextEncoding::Utf8).toPositionInSet());