9 #ifndef BITCOIN_UTIL_STRENCODINGS_H 10 #define BITCOIN_UTIL_STRENCODINGS_H 24 #include <string_view> 25 #include <system_error> 26 #include <type_traits> 51 t = 1'000
'000'000
'000ULL, 62 std::string SanitizeString(std::string_view str, int rule = SAFE_CHARS_DEFAULT); 64 template <typename Byte = std::byte> 65 std::optional<std::vector<Byte>> TryParseHex(std::string_view str); 67 template <typename Byte = uint8_t> 68 std::vector<Byte> ParseHex(std::string_view hex_str) 70 return TryParseHex<Byte>(hex_str).value_or(std::vector<Byte>{}); 72 /* Returns true if each character in str is a hex character, and has an even 73 * number of hex digits.*/ 74 bool IsHex(std::string_view str); 75 std::optional<std::vector<unsigned char>> DecodeBase64(std::string_view str); 76 std::string EncodeBase64(Span<const unsigned char> input); 77 inline std::string EncodeBase64(Span<const std::byte> input) { return EncodeBase64(MakeUCharSpan(input)); } 78 inline std::string EncodeBase64(std::string_view str) { return EncodeBase64(MakeUCharSpan(str)); } 79 std::optional<std::vector<unsigned char>> DecodeBase32(std::string_view str); 86 std::string EncodeBase32(Span<const unsigned char> input, bool pad = true); 93 std::string EncodeBase32(std::string_view str, bool pad = true); 104 bool SplitHostPort(std::string_view in, uint16_t& portOut, std::string& hostOut); 106 // LocaleIndependentAtoi is provided for backwards compatibility reasons. 108 // New code should use ToIntegral or the ParseInt* functions 109 // which provide parse error feedback. 111 // The goal of LocaleIndependentAtoi is to replicate the defined behaviour of 112 // std::atoi as it behaves under the "C" locale, and remove some undefined 113 // behavior. If the parsed value is bigger than the integer type's maximum
117 template <
typename T>
120 static_assert(std::is_integral<T>::value);
124 if (!
s.empty() &&
s[0] ==
'+') {
125 if (
s.length() >= 2 &&
s[1] ==
'-') {
130 auto [
_, error_condition] = std::from_chars(
s.data(),
s.data() +
s.size(),
result);
131 if (error_condition == std::errc::result_out_of_range) {
132 if (
s.length() >= 1 &&
s[0] ==
'-') {
134 return std::numeric_limits<T>::min();
137 return std::numeric_limits<T>::max();
139 }
else if (error_condition != std::errc{}) {
152 return c >=
'0' && c <=
'9';
166 constexpr
inline bool IsSpace(
char c) noexcept {
167 return c ==
' ' || c ==
'\f' || c ==
'\n' || c ==
'\r' || c ==
'\t' || c ==
'\v';
178 template <
typename T>
181 static_assert(std::is_integral<T>::value);
183 const auto [first_nonmatching, error_condition] = std::from_chars(str.data(), str.data() + str.size(),
result);
184 if (first_nonmatching != str.data() + str.size() || error_condition != std::errc{}) {
195 [[nodiscard]]
bool ParseInt32(std::string_view str, int32_t *
out);
202 [[nodiscard]]
bool ParseInt64(std::string_view str, int64_t *
out);
209 [[nodiscard]]
bool ParseUInt8(std::string_view str, uint8_t *
out);
216 [[nodiscard]]
bool ParseUInt16(std::string_view str, uint16_t*
out);
223 [[nodiscard]]
bool ParseUInt32(std::string_view str, uint32_t *
out);
230 [[nodiscard]]
bool ParseUInt64(std::string_view str, uint64_t *
out);
236 std::string
FormatParagraph(std::string_view in,
size_t width = 79,
size_t indent = 0);
243 template <
typename T>
246 if (b.size() == 0)
return a.size() == 0;
247 size_t accumulator = a.size() ^ b.size();
248 for (
size_t i = 0; i < a.size(); i++)
249 accumulator |=
size_t(a[i] ^ b[i%b.size()]);
250 return accumulator == 0;
257 [[nodiscard]]
bool ParseFixedPoint(std::string_view,
int decimals, int64_t *amount_out);
263 [[maybe_unused]]
int operator()(
int x)
const {
return x; }
269 template<
int frombits,
int tobits,
bool pad,
typename O,
typename It,
typename I = IntIdentity>
273 constexpr
size_t maxv = (1 << tobits) - 1;
274 constexpr
size_t max_acc = (1 << (frombits + tobits - 1)) - 1;
277 if (v < 0)
return false;
278 acc = ((acc << frombits) | v) & max_acc;
280 while (bits >= tobits) {
282 outfn((acc >> bits) & maxv);
287 if (bits) outfn((acc << (tobits - bits)) & maxv);
288 }
else if (bits >= frombits || ((acc << (tobits - bits)) & maxv)) {
306 return (c >=
'A' && c <=
'Z' ? (c -
'A') +
'a' : c);
318 std::string
ToLower(std::string_view str);
332 return (c >=
'a' && c <=
'z' ? (c -
'a') +
'A' : c);
344 std::string
ToUpper(std::string_view str);
374 if (c >=
'0' && c <=
'9')
return c -
'0';
375 if (c >=
'a' && c <=
'f')
return c -
'a' + 0xa;
377 throw "Only lowercase hex digits are allowed, for consistency";
383 std::array<std::byte, N / 2> bytes{};
384 consteval
Hex(
const char (&hex_str)[N])
388 if (hex_str[N - 1])
throw "null terminator required";
389 for (std::size_t i = 0; i < bytes.size(); ++i) {
390 bytes[i] =
static_cast<std::byte
>(
427 inline namespace hex_literals {
429 template <util::detail::Hex str>
430 constexpr
auto operator""_hex() {
return str.
bytes; }
432 template <util::detail::Hex str>
433 constexpr
auto operator""_hex_u8() {
return std::bit_cast<std::array<uint8_t, str.bytes.size()>>(str.bytes); }
435 template <util::detail::Hex str>
436 constexpr
auto operator""_hex_v() {
return std::vector<std::byte>{str.bytes.begin(), str.bytes.end()}; }
438 template <util::detail::Hex str>
439 inline auto operator""_hex_v_u8() {
return std::vector<uint8_t>{
UCharCast(str.bytes.data()),
UCharCast(str.bytes.data() + str.bytes.size())}; }
444 #endif // BITCOIN_UTIL_STRENCODINGS_H bool TimingResistantEqual(const T &a, const T &b)
Timing-attack-resistant comparison.
The full set of allowed chars.
constexpr char ToUpper(char c)
Converts the given character to its uppercase equivalent.
T LocaleIndependentAtoi(std::string_view str)
std::optional< uint64_t > ParseByteUnits(std::string_view str, ByteUnit default_multiplier)
Parse a string with suffix unit [k|K|m|M|g|G|t|T].
bool ParseUInt64(std::string_view str, uint64_t *out)
Convert decimal string to unsigned 64-bit integer with strict parse error feedback.
bool ParseUInt16(std::string_view str, uint16_t *out)
Convert decimal string to unsigned 16-bit integer with strict parse error feedback.
bool ParseFixedPoint(std::string_view, int decimals, int64_t *amount_out)
Parse number as fixed point according to JSON number syntax.
constexpr bool IsDigit(char c)
Tests if the given character is a decimal digit.
bool ParseUInt32(std::string_view str, uint32_t *out)
Convert decimal string to unsigned 32-bit integer with strict parse error feedback.
consteval auto _(util::TranslatedLiteral str)
bool ParseInt32(std::string_view str, int32_t *out)
Convert string to signed 32-bit integer with strict parse error feedback.
std::string_view TrimStringView(std::string_view str, std::string_view pattern=" \\\)
consteval uint8_t ConstevalHexDigit(const char c)
consteval version of HexDigit() without the lookup table.
SafeChars
Utilities for converting data from/to strings.
bool ParseUInt8(std::string_view str, uint8_t *out)
Convert decimal string to unsigned 8-bit integer with strict parse error feedback.
std::string Capitalize(std::string str)
Capitalizes the first character of the given string.
ByteUnit
Used by ParseByteUnits() Lowercase base 1000 Uppercase base 1024.
Chars allowed in filenames.
constexpr bool IsSpace(char c) noexcept
Tests if the given character is a whitespace character.
std::optional< T > ToIntegral(std::string_view str)
Convert string to integral type T.
unsigned char * UCharCast(char *c)
bool ParseInt64(std::string_view str, int64_t *out)
Convert string to signed 64-bit integer with strict parse error feedback.
constexpr char ToLower(char c)
Converts the given character to its lowercase equivalent.
bool ConvertBits(O outfn, It it, It end, I infn={})
Convert from one power-of-2 number base to another.
Chars allowed in URIs (RFC 3986)
std::string FormatParagraph(std::string_view in, size_t width=79, size_t indent=0)
Format a paragraph of text to a fixed width, adding spaces for indentation to any added line...
std::array< std::byte, N/2 > bytes