diff --git a/server/src/utils/tohex.cpp b/server/src/utils/tohex.cpp new file mode 100644 index 00000000..c0576d05 --- /dev/null +++ b/server/src/utils/tohex.cpp @@ -0,0 +1,36 @@ +/** + * server/src/utils/tohex.cpp + * + * This file is part of the traintastic source code. + * + * Copyright (C) 2022 Reinder Feenstra + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "tohex.hpp" + +std::string toHex(const void* buffer, const size_t size) +{ + std::string s; + s.reserve(size * 2); + const uint8_t* p = reinterpret_cast(buffer); + for(size_t i = 0; i < size; i++, p++) + { + s.push_back(toHexDigits[*p >> 4]); + s.push_back(toHexDigits[*p & 0x0F]); + } + return s; +} diff --git a/server/src/utils/tohex.hpp b/server/src/utils/tohex.hpp index e3d8c72d..a7136bbd 100644 --- a/server/src/utils/tohex.hpp +++ b/server/src/utils/tohex.hpp @@ -3,7 +3,7 @@ * * This file is part of the traintastic source code. * - * Copyright (C) 2019-2020 Reinder Feenstra + * Copyright (C) 2019-2020,2022 Reinder Feenstra * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -24,15 +24,25 @@ #define TRAINTASTIC_SERVER_UTILS_TOHEX_HPP #include +#include +#include -template +static const std::string_view toHexDigits = "0123456789ABCDEF"; + +template && !std::is_pointer_v>> std::string toHex(T value, size_t length = sizeof(T) * 2) { - static const char* digits = "0123456789ABCDEF"; std::string s(length, '0'); for(size_t i = 0, j = length - 1; i < length; i++, j--) - s[j] = digits[(value >> (i * 4)) & 0xf]; + s[j] = toHexDigits[(value >> (i * 4)) & 0xf]; return s; } +std::string toHex(const void* buffer, size_t size); + +inline std::string toHex(std::string_view value) +{ + return toHex(value.data(), value.size()); +} + #endif