8#include <cppunit/TestFixture.h>
9#include <cppunit/extensions/HelperMacros.h>
12#include <initializer_list>
16#ifdef CPP_UTILITIES_USE_STANDARD_FILESYSTEM
22using namespace CPPUNIT_NS;
26static_assert(
toNormalInt(383) == 255,
"toNormalInt()");
27static_assert(
swapOrder(
static_cast<std::uint16_t
>(0xABCD)) == 0xCDAB,
"swapOrder(std::uint16_t)");
28static_assert(
swapOrder(
static_cast<std::uint32_t
>(0xABCDEF12u)) == 0x12EFCDABu,
"swapOrder(std::uint32_t)");
29static_assert(
swapOrder(
static_cast<std::uint64_t
>(0xABCDEF1234567890ul)) == 0x9078563412EFCDABul,
"swapOrder(std::uint64_t)");
30static_assert(
swapOrder(
static_cast<std::int16_t
>(0xABCD)) ==
static_cast<std::int16_t
>(0xCDAB),
"swapOrder(std::int16_t)");
31static_assert(
swapOrder(
static_cast<std::int32_t
>(0xABCDEF12)) == 0x12EFCDAB,
"swapOrder(std::int32_t)");
32static_assert(
swapOrder(
static_cast<std::int64_t
>(0xABCDEF1234567890l)) ==
static_cast<std::int64_t
>(0x9078563412EFCDABl),
"swapOrder(std::int64_t)");
46 CPPUNIT_TEST_SUITE_END();
67 template <
typename intType>
68 void testConversion(
const char *message, function<
void(intType,
char *)> vice, function<intType(
const char *)> verca, intType
min, intType
max);
71 random_device m_randomDevice;
72 mt19937 m_randomEngine;
79 , m_randomEngine(m_randomDevice())
96 } test = { 0x01020304 };
97#if defined(CONVERSION_UTILITIES_BYTE_ORDER_BIG_ENDIAN)
99 CPPUNIT_ASSERT(CONVERSION_UTILITIES_IS_BYTE_ORDER_BIG_ENDIAN ==
true);
100 CPPUNIT_ASSERT(CONVERSION_UTILITIES_IS_BYTE_ORDER_LITTLE_ENDIAN ==
false);
102 CPPUNIT_ASSERT_MESSAGE(
"Byte order assumption (big-endian) is wrong", test.characters[0] == 0x01);
103#elif defined(CONVERSION_UTILITIES_BYTE_ORDER_LITTLE_ENDIAN)
105 CPPUNIT_ASSERT(CONVERSION_UTILITIES_IS_BYTE_ORDER_BIG_ENDIAN ==
false);
106 CPPUNIT_ASSERT(CONVERSION_UTILITIES_IS_BYTE_ORDER_LITTLE_ENDIAN ==
true);
108 CPPUNIT_ASSERT_MESSAGE(
"Byte order assumption (little-endian) is wrong", test.characters[0] == 0x04);
110 CPPUNIT_FAIL(
"There is not valid byte order assumption");
114template <
typename intType>
115void ConversionTests::testConversion(
116 const char *message, function<
void(intType,
char *)> vice, function<intType(
const char *)> versa, intType
min, intType
max)
118 const intType random = uniform_int_distribution<intType>(
min,
max)(m_randomEngine);
120 msg << message <<
'(' << hex <<
'0' <<
'x' << random <<
')';
121 vice(random, m_buff);
122 CPPUNIT_ASSERT_EQUAL_MESSAGE(msg.str(), random, versa(m_buff));
125#define TEST_TYPE(endianness, function) decltype(endianness::function(m_buff))
127#define TEST_CONVERSION(function, endianness) \
128 testConversion<TEST_TYPE(endianness, function)>("testing " #endianness "::" #function, \
129 static_cast<void (*)(TEST_TYPE(endianness, function), char *)>(&endianness::getBytes), endianness::function, \
130 numeric_limits<TEST_TYPE(endianness, function)>::min(), numeric_limits<TEST_TYPE(endianness, function)>::max())
132#define TEST_BE_CONVERSION(function) TEST_CONVERSION(function, BE)
134#define TEST_LE_CONVERSION(function) TEST_CONVERSION(function, LE)
136#define TEST_CUSTOM_CONVERSION(vice, versa, endianness, min, max) \
137 testConversion<TEST_TYPE(endianness, versa)>("testing " #versa " (" #endianness ")", \
138 static_cast<void (*)(TEST_TYPE(endianness, versa), char *)>(&endianness::vice), endianness::versa, min, max)
149 for (
auto b = 1; b < 100; ++b) {
172 CPPUNIT_ASSERT(
swapOrder(
static_cast<std::uint16_t
>(0x7825)) == 0x2578);
173 CPPUNIT_ASSERT(
swapOrder(
static_cast<std::uint32_t
>(0x12345678)) == 0x78563412);
174 CPPUNIT_ASSERT(
swapOrder(
static_cast<std::uint64_t
>(0x1122334455667788)) == 0x8877665544332211);
180void assertEqual(
const char *message,
const std::uint8_t *expectedValues,
size_t expectedSize,
const StringData &actualValues)
183 CPPUNIT_ASSERT_EQUAL_MESSAGE(message, expectedSize, actualValues.second);
185 auto *end = expectedValues + expectedSize;
186 auto *
i =
reinterpret_cast<std::uint8_t *
>(actualValues.first.get());
187 for (; expectedValues != end; ++expectedValues, ++
i) {
192#if CONVERSION_UTILITIES_IS_BYTE_ORDER_LITTLE_ENDIAN == true
193#define LE_STR_FOR_ENDIANNESS(name) name##LE##String
194#define BE_STR_FOR_ENDIANNESS(name) name##BE##String
195#elif CONVERSION_UTILITIES_IS_BYTE_ORDER_BIG_ENDIAN == true
196#define LE_STR_FOR_ENDIANNESS(name) name##BE##String
197#define BE_STR_FOR_ENDIANNESS(name) name##LE##String
216 const std::uint8_t simpleString[] = {
'A',
'B',
'C',
'D' };
217 const std::uint16_t simpleUtf16LEString[] = { 0x0041, 0x0042, 0x0043, 0x0044 };
218 const std::uint16_t simpleUtf16BEString[] = { 0x4100, 0x4200, 0x4300, 0x4400 };
220 const std::uint8_t latin1String[] = {
'A',
'B', 0xD6,
'C',
'D' };
221 const std::uint8_t utf8String[] = {
'A',
'B', 0xC3, 0x96,
'C',
'D' };
222 const std::uint16_t utf16LEString[] = { 0x0041, 0x0042, 0x00D6, 0x0043, 0x0044 };
223 const std::uint16_t utf16BEString[] = { 0x4100, 0x4200, 0xD600, 0x4300, 0x4400 };
228 "UTF-16LE to UTF-8 (simple)", simpleString, 4,
convertUtf16LEToUtf8(
reinterpret_cast<const char *
>(LE_STR_FOR_ENDIANNESS(simpleUtf16)), 8));
231 "UTF-16BE to UTF-8 (simple)", simpleString, 4,
convertUtf16BEToUtf8(
reinterpret_cast<const char *
>(BE_STR_FOR_ENDIANNESS(simpleUtf16)), 8));
236 assertEqual(
"UTF-8 to UFT-16LE (simple)",
reinterpret_cast<const std::uint8_t *
>(LE_STR_FOR_ENDIANNESS(simpleUtf16)), 8,
238 assertEqual(
"UTF-8 to UFT-16LE",
reinterpret_cast<const std::uint8_t *
>(LE_STR_FOR_ENDIANNESS(utf16)), 10,
240 assertEqual(
"UTF-8 to UFT-16BE (simple)",
reinterpret_cast<const std::uint8_t *
>(BE_STR_FOR_ENDIANNESS(simpleUtf16)), 8,
242 assertEqual(
"UTF-8 to UFT-16BE",
reinterpret_cast<const std::uint8_t *
>(BE_STR_FOR_ENDIANNESS(utf16)), 10,
255 uniform_int_distribution<std::int64_t> randomDistSigned(numeric_limits<std::int64_t>::min());
256 uniform_int_distribution<std::uint64_t> randomDistUnsigned(0);
257 const string stringMsg(
"string"), wideStringMsg(
"wide string"), bufferMsg(
"buffer");
258 for (std::uint8_t b = 1; b < 100; ++b) {
259 auto signedRandom = randomDistSigned(m_randomEngine);
260 auto unsignedRandom = randomDistUnsigned(m_randomEngine);
261 for (
const auto base : initializer_list<std::uint8_t>{ 2, 8, 10, 16 }) {
268 for (
const auto base : initializer_list<std::uint8_t>{ 10 }) {
308 CPPUNIT_ASSERT_EQUAL_MESSAGE(
310 vector<string> splitTestExpected({
"1",
"2,3" });
312 CPPUNIT_ASSERT_EQUAL(splitTestExpected, splitTestActual);
314 CPPUNIT_ASSERT_EQUAL(splitTestExpected, splitTestActual);
315 splitTestExpected = {
"12",
"34",
"56",
"" };
317 CPPUNIT_ASSERT_EQUAL(splitTestExpected, splitTestActual);
319 CPPUNIT_ASSERT_EQUAL(splitTestExpected, splitTestActual);
320 splitTestExpected = {
"1",
"2,3",
"4,,5" };
321 splitTestActual =
splitString<vector<string>>(
"1,2,,3,4,,5"s,
","s, EmptyPartsTreat::Merge, 3);
322 CPPUNIT_ASSERT_EQUAL(splitTestExpected, splitTestActual);
323 string splitJoinTest =
joinStrings(
splitString<vector<string>>(
",a,,ab,ABC,s"s,
","s, EmptyPartsTreat::Keep),
" "s,
false,
"("s,
")"s);
324 CPPUNIT_ASSERT_EQUAL(
"() (a) () (ab) (ABC) (s)"s, splitJoinTest);
325 splitJoinTest =
joinStrings(
splitString<vector<string>>(
",a,,ab,ABC,s"s,
","s, EmptyPartsTreat::Keep),
" "s,
true,
"("s,
")"s);
326 CPPUNIT_ASSERT_EQUAL(
"(a) (ab) (ABC) (s)"s, splitJoinTest);
327 splitJoinTest =
joinStrings(
splitStringSimple<vector<string>>(
",a,,ab,ABC,s"s,
","s),
" "s,
true,
"("s,
")"s);
328 CPPUNIT_ASSERT_EQUAL(
"(a) (ab) (ABC) (s)"s, splitJoinTest);
329 splitJoinTest =
joinStrings(
splitString<vector<string>>(
",a,,ab,ABC,s"s,
","s, EmptyPartsTreat::Omit),
" "s,
false,
"("s,
")"s);
330 CPPUNIT_ASSERT_EQUAL(
"(a) (ab) (ABC) (s)"s, splitJoinTest);
331 splitJoinTest =
joinStrings(
splitString<vector<string>>(
",a,,ab,ABC,s"s,
","s, EmptyPartsTreat::Merge),
" "s,
false,
"("s,
")"s);
332 CPPUNIT_ASSERT_EQUAL(
"(a,ab) (ABC) (s)"s, splitJoinTest);
335 string findReplaceTest(
"findAndReplace()");
337 CPPUNIT_ASSERT_EQUAL(
"findOrReplace()"s, findReplaceTest);
340 CPPUNIT_ASSERT(!
startsWith(findReplaceTest,
"findAnd"));
341 CPPUNIT_ASSERT(
startsWith(findReplaceTest,
"findOr"));
342 CPPUNIT_ASSERT(!
startsWith(findReplaceTest,
"findAnd"s));
343 CPPUNIT_ASSERT(
startsWith(findReplaceTest,
"findOr"s));
346 CPPUNIT_ASSERT(!
startsWith(
"test"s,
"tests"s));
347 CPPUNIT_ASSERT(!
startsWith(
"test"s,
"tests"));
350 CPPUNIT_ASSERT(!
endsWith(findReplaceTest,
"AndReplace()"));
351 CPPUNIT_ASSERT(
endsWith(findReplaceTest,
"OrReplace()"));
352 CPPUNIT_ASSERT(!
endsWith(findReplaceTest,
"AndReplace()"s));
353 CPPUNIT_ASSERT(
endsWith(findReplaceTest,
"OrReplace()"s));
354 CPPUNIT_ASSERT(
endsWith(
"test"s,
"test"s));
355 CPPUNIT_ASSERT(
endsWith(
"test"s,
"test"));
356 CPPUNIT_ASSERT(!
endsWith(
"test"s,
" test"s));
357 CPPUNIT_ASSERT(!
endsWith(
"test"s,
" test"));
364 string truncateTest(
"foo bar ");
366 CPPUNIT_ASSERT_EQUAL(
"foo"s, truncateTest);
369 std::uniform_int_distribution<int> randomDistChar;
370 std::uint8_t originalBase64Data[4047];
371 for (std::uint8_t &c : originalBase64Data) {
372 c =
static_cast<std::uint8_t
>(randomDistChar(m_randomEngine) & 0xFF);
374 auto encodedBase64Data =
encodeBase64(originalBase64Data,
sizeof(originalBase64Data));
375 auto decodedBase64Data =
decodeBase64(encodedBase64Data.data(),
static_cast<std::uint32_t
>(encodedBase64Data.size()));
376 CPPUNIT_ASSERT(decodedBase64Data.second ==
sizeof(originalBase64Data));
377 for (
unsigned int i = 0;
i <
sizeof(originalBase64Data); ++
i) {
378 CPPUNIT_ASSERT(decodedBase64Data.first[
i] == originalBase64Data[
i]);
381 encodedBase64Data =
encodeBase64(originalBase64Data,
sizeof(originalBase64Data) - 1);
382 CPPUNIT_ASSERT_EQUAL(
'=', encodedBase64Data.at(encodedBase64Data.size() - 1));
383 CPPUNIT_ASSERT_NO_THROW(
decodeBase64(encodedBase64Data.data(),
static_cast<std::uint32_t
>(encodedBase64Data.size())));
384 encodedBase64Data =
encodeBase64(originalBase64Data,
sizeof(originalBase64Data) - 2);
385 CPPUNIT_ASSERT_EQUAL(
'=', encodedBase64Data.at(encodedBase64Data.size() - 1));
386 CPPUNIT_ASSERT_EQUAL(
'=', encodedBase64Data.at(encodedBase64Data.size() - 2));
387 CPPUNIT_ASSERT_NO_THROW(
decodeBase64(encodedBase64Data.data(),
static_cast<std::uint32_t
>(encodedBase64Data.size())));
394 CPPUNIT_ASSERT_EQUAL(
"2.50 KiB (2560 byte)"s,
dataSizeToString((2048ull + 512ull),
true));
395 CPPUNIT_ASSERT_EQUAL(
"2.50 MiB"s,
dataSizeToString((2048ull + 512ull) * 1024ull));
396 CPPUNIT_ASSERT_EQUAL(
"2.50 GiB"s,
dataSizeToString((2048ull + 512ull) * 1024ull * 1024ull));
397 CPPUNIT_ASSERT_EQUAL(
"2.50 TiB"s,
dataSizeToString((2048ull + 512ull) * 1024ull * 1024ull * 1024ull));
400 CPPUNIT_ASSERT_EQUAL(
"128 Mbit/s"s,
bitrateToString(128.0 * 1e3,
false));
401 CPPUNIT_ASSERT_EQUAL(
"128 Gbit/s"s,
bitrateToString(128.0 * 1e6,
false));
410struct ConvertibleToString {
411 operator std::string()
const;
414struct StringThatDoesNotLikeToBeCopiedOrMoved :
public std::string {
415 explicit StringThatDoesNotLikeToBeCopiedOrMoved(
const char *value)
419 [[noreturn]] StringThatDoesNotLikeToBeCopiedOrMoved(
const StringThatDoesNotLikeToBeCopiedOrMoved &other)
422 CPPUNIT_FAIL(
"attempt to copy string: " + other);
424 [[noreturn]] StringThatDoesNotLikeToBeCopiedOrMoved(StringThatDoesNotLikeToBeCopiedOrMoved &&other)
425 :
std::string(
std::move(other))
427 CPPUNIT_FAIL(
"attempt to move string: " + other);
436 static_assert(Helper::IsStringType<std::string, std::string>::value);
437 static_assert(!Helper::IsStringType<std::string, std::wstring>::value);
438 static_assert(Helper::IsStringType<std::wstring, std::wstring>::value);
439 static_assert(Helper::IsStringViewType<std::string, std::string_view>::value);
440 static_assert(!Helper::IsStringViewType<std::wstring, std::string_view>::value);
441 static_assert(Helper::IsStringViewType<std::wstring, std::wstring_view>::value);
442 static_assert(Helper::IsConvertibleToConstStringRef<std::string, ConvertibleToString>::value);
443#ifdef CPP_UTILITIES_USE_STANDARD_FILESYSTEM
444 static_assert(!Helper::IsConvertibleToConstStringRef<std::filesystem::path::string_type, std::filesystem::path>::value,
445 "conversion via native() preferred");
448 !Helper::IsConvertibleToConstStringRef<std::string, std::string>::value,
"yes, in this context this should not be considered convertible");
449 static_assert(!Helper::IsConvertibleToConstStringRef<std::wstring, ConvertibleToString>::value);
450#ifdef CPP_UTILITIES_USE_STANDARD_FILESYSTEM
451 static_assert(Helper::IsConvertibleToConstStringRefViaNative<std::filesystem::path::string_type, std::filesystem::path>::value);
453 static_assert(!Helper::IsConvertibleToConstStringRefViaNative<std::string, std::string>::value);
456 const tuple<const char *, string, int, const char *> tuple(
"string1",
"string2", 1234,
"string3");
457 CPPUNIT_ASSERT_EQUAL(
"string1string21234string3"s,
tupleToString(tuple));
458 CPPUNIT_ASSERT_EQUAL(
"foobarfoo2bar2"s,
tupleToString(
"foo"s %
"bar" %
"foo2"s %
"bar2"));
459 CPPUNIT_ASSERT_EQUAL(
"v2.3.0"s,
argsToString(
"v2.", 3,
'.', 0));
460 CPPUNIT_ASSERT_EQUAL(
"v2.3.0"s,
argsToString(
'v', make_tuple(2,
'.', 3,
'.', 0)));
461#ifdef CPP_UTILITIES_USE_STANDARD_FILESYSTEM
462 if constexpr (std::is_same_v<std::filesystem::path::value_type, std::string::value_type>) {
463 CPPUNIT_ASSERT_EQUAL(
"path: foo"s,
argsToString(
"path: ", std::filesystem::path(
"foo")));
468 CPPUNIT_ASSERT_EQUAL_MESSAGE(
"result can be passed to any function taking a std::string"s,
"123456789"s,
"12" %
string(
"34") %
'5' % 67 +
"89");
469 constexpr double velocityExample = 27.0;
470 CPPUNIT_ASSERT_EQUAL_MESSAGE(
"real-word example"s,
"velocity: 27 km/h (7.5 m/s)"s,
472 CPPUNIT_ASSERT_EQUAL_MESSAGE(
473 "regular + operator still works (no problems with ambiguity)"s,
"regular + still works"s,
"regular"s +
" + still works");
474 CPPUNIT_ASSERT_EQUAL_MESSAGE(
"using string_view",
"foobar123"s,
"foo"sv %
"bar"sv + 123);
477 StringThatDoesNotLikeToBeCopiedOrMoved str(
" happen ");
478 const StringThatDoesNotLikeToBeCopiedOrMoved str2(
"for this");
479 CPPUNIT_ASSERT_EQUAL(
"no copy/move should happen for this!"s,
480 argsToString(StringThatDoesNotLikeToBeCopiedOrMoved(
"no copy/move should"), str, str2, StringThatDoesNotLikeToBeCopiedOrMoved(
"!")));
The ConversionTests class tests classes and functions provided by the files inside the conversion dir...
void testSwapOrderFunctions()
Tests swap order functions.
void testBinaryConversions()
Tests most important binary conversions.
void testStringEncodingConversions()
Tests string encoding conversions.
void testConversionException()
void testEndianness()
Tests whether macros for endianness are correct.
void testStringConversions()
Tests miscellaneous string conversions.
The ConversionException class is thrown by the various conversion functions of this library when a co...
void assertEqual(const char *message, const std::uint8_t *expectedValues, size_t expectedSize, const StringData &actualValues)
Internally used for string encoding tests to check results.
#define TEST_BE_CONVERSION(function)
#define TEST_LE_CONVERSION(function)
#define TEST_CUSTOM_CONVERSION(vice, versa, endianness, min, max)
CPPUNIT_TEST_SUITE_REGISTRATION(ConversionTests)
Contains all utilities provides by the c++utilities library.
void findAndReplace(StringType1 &str, const StringType2 &find, const StringType3 &replace)
Replaces all occurrences of find with relpace in the specified str.
CPP_UTILITIES_EXPORT StringData convertUtf8ToUtf16BE(const char *inputBuffer, std::size_t inputBufferSize)
Converts the specified UTF-8 string to UTF-16 (big-endian).
CPP_UTILITIES_EXPORT StringData convertString(const char *fromCharset, const char *toCharset, const char *inputBuffer, std::size_t inputBufferSize, float outputBufferSizeFactor=1.0f)
Converts the specified string from one character set to another.
std::pair< std::unique_ptr< char[], StringDataDeleter >, std::size_t > StringData
Type used to return string encoding conversion result.
StringType numberToString(IntegralType number, BaseType base=10)
Converts the given number to its equivalent string representation using the specified base.
CPP_UTILITIES_EXPORT constexpr std::uint32_t toNormalInt(std::uint32_t synchsafeInt)
Returns a normal 32-bit integer converted from a 32-bit synchsafe integer.
CPP_UTILITIES_EXPORT StringData convertLatin1ToUtf8(const char *inputBuffer, std::size_t inputBufferSize)
Converts the specified Latin-1 string to UTF-8.
CPP_UTILITIES_EXPORT StringData convertUtf16LEToUtf8(const char *inputBuffer, std::size_t inputBufferSize)
Converts the specified UTF-16 (little-endian) string to UTF-8.
CPP_UTILITIES_EXPORT std::pair< std::unique_ptr< std::uint8_t[]>, std::uint32_t > decodeBase64(const char *encodedStr, const std::uint32_t strSize)
Decodes the specified Base64 encoded string.
ReturnType joinStrings(const Container &strings, Detail::StringParamForContainer< Container > delimiter=Detail::StringParamForContainer< Container >(), bool omitEmpty=false, Detail::StringParamForContainer< Container > leftClosure=Detail::StringParamForContainer< Container >(), Detail::StringParamForContainer< Container > rightClosure=Detail::StringParamForContainer< Container >())
Joins the given strings using the specified delimiter.
CPP_UTILITIES_EXPORT constexpr std::uint16_t swapOrder(std::uint16_t value)
Swaps the byte order of the specified 16-bit unsigned integer.
bool startsWith(const StringType &str, const StringType &phrase)
Returns whether str starts with phrase.
IntegralType stringToNumber(const StringType &string, BaseType base=10)
Converts the given string to an unsigned/signed number assuming string uses the specified base.
CPP_UTILITIES_EXPORT void truncateString(std::string &str, char terminationChar='\0')
Truncates all characters after the first occurrence of the specified terminationChar and the terminat...
CPP_UTILITIES_EXPORT StringData convertUtf16BEToUtf8(const char *inputBuffer, std::size_t inputBufferSize)
Converts the specified UTF-16 (big-endian) string to UTF-8.
Container splitStringSimple(Detail::StringParamForContainer< Container > string, Detail::StringParamForContainer< Container > delimiter, int maxParts=-1)
Splits the given string (which might also be a string view) at the specified delimiter.
StringType argsToString(Args &&...args)
bool containsSubstrings(const StringType &str, std::initializer_list< StringType > substrings)
Returns whether str contains the specified substrings.
constexpr T max(T first, T second)
Returns the greatest of the given items.
StringType tupleToString(const std::tuple< Args... > &tuple)
Concatenates all strings hold by the specified tuple.
AsHexNumber< T > asHexNumber(const T &value)
Wraps a value to be printed using the hex system in the error case when asserted with cppunit (or sim...
CPP_UTILITIES_EXPORT StringData convertUtf8ToLatin1(const char *inputBuffer, std::size_t inputBufferSize)
Converts the specified UTF-8 string to Latin-1.
std::string interpretIntegerAsString(T integer, int startOffset=0)
Interprets the given integer at the specified position as std::string using the specified byte order.
bool endsWith(const StringType &str, const StringType &phrase)
Returns whether str ends with phrase.
CPP_UTILITIES_EXPORT constexpr std::uint32_t toSynchsafeInt(std::uint32_t normalInt)
Returns a 32-bit synchsafe integer converted from a normal 32-bit integer.
CPP_UTILITIES_EXPORT StringData convertUtf8ToUtf16LE(const char *inputBuffer, std::size_t inputBufferSize)
Converts the specified UTF-8 string to UTF-16 (little-endian).
CPP_UTILITIES_EXPORT std::string bitrateToString(double speedInKbitsPerSecond, bool useByteInsteadOfBits=false)
Converts the specified bitrate in kbit/s to its equivalent std::string representation.
constexpr T min(T first, T second)
Returns the smallest of the given items.
CPP_UTILITIES_EXPORT std::string encodeBase64(const std::uint8_t *data, std::uint32_t dataSize)
Encodes the specified data to Base64.
CPP_UTILITIES_EXPORT std::string dataSizeToString(std::uint64_t sizeInByte, bool includeByte=false)
Converts the specified data size in byte to its equivalent std::string representation.
IntegralType bufferToNumber(const CharType *string, std::size_t size, BaseType base=10)
Converts the given string of size characters to an unsigned numeric value using the specified base.
Container splitString(Detail::StringParamForContainer< Container > string, Detail::StringParamForContainer< Container > delimiter, EmptyPartsTreat emptyPartsRole=EmptyPartsTreat::Keep, int maxParts=-1)
Splits the given string at the specified delimiter.