From 646fc4d30253c704e6b99f81daa2a307f698bd5f Mon Sep 17 00:00:00 2001 From: Martchus Date: Thu, 8 Jun 2017 00:48:10 +0200 Subject: [PATCH] Fix TagValue::toInteger() from Latin1/UTF-8 str --- CMakeLists.txt | 2 +- tagvalue.cpp | 6 ++---- tests/tagvalue.cpp | 1 + 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 061ca8a..7b41a39 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -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 diff --git a/tagvalue.cpp b/tagvalue.cpp index 6941f15..9dc6eb6 100644 --- a/tagvalue.cpp +++ b/tagvalue.cpp @@ -170,7 +170,7 @@ int32 TagValue::toInteger() const case TagTextEncoding::Unspecified: case TagTextEncoding::Latin1: case TagTextEncoding::Utf8: - return ConversionUtilities::stringToNumber(m_ptr.get()); + return ConversionUtilities::bufferToNumber(m_ptr.get(), m_size); case TagTextEncoding::Utf16LittleEndian: case TagTextEncoding::Utf16BigEndian: u16string u16str(reinterpret_cast(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(m_ptr.get()); - return res; + return *reinterpret_cast(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."); } diff --git a/tests/tagvalue.cpp b/tests/tagvalue.cpp index 30922b3..cdaed77 100644 --- a/tests/tagvalue.cpp +++ b/tests/tagvalue.cpp @@ -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());