Add hex_encode.
GitOrigin-RevId: f5b42ce196f463d9d5cdb4536ee7b829f198583b
This commit is contained in:
parent
7ca14d0851
commit
2f52861c20
@ -98,21 +98,32 @@ Result<string> hex_decode(Slice hex) {
|
|||||||
return std::move(result);
|
return std::move(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
string hex_encode(Slice data) {
|
||||||
|
const char *hex = "0123456789abcdef";
|
||||||
|
string res;
|
||||||
|
res.reserve(2 * data.size());
|
||||||
|
for (unsigned char c : data) {
|
||||||
|
res.push_back(hex[c >> 4]);
|
||||||
|
res.push_back(hex[c & 15]);
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
static bool is_url_char(char c) {
|
static bool is_url_char(char c) {
|
||||||
return is_alnum(c) || c == '-' || c == '.' || c == '_' || c == '~';
|
return is_alnum(c) || c == '-' || c == '.' || c == '_' || c == '~';
|
||||||
}
|
}
|
||||||
|
|
||||||
string url_encode(Slice str) {
|
string url_encode(Slice data) {
|
||||||
size_t length = 3 * str.size();
|
size_t length = 3 * data.size();
|
||||||
for (auto c : str) {
|
for (auto c : data) {
|
||||||
length -= 2 * is_url_char(c);
|
length -= 2 * is_url_char(c);
|
||||||
}
|
}
|
||||||
if (length == str.size()) {
|
if (length == data.size()) {
|
||||||
return str.str();
|
return data.str();
|
||||||
}
|
}
|
||||||
string result;
|
string result;
|
||||||
result.reserve(length);
|
result.reserve(length);
|
||||||
for (auto c : str) {
|
for (auto c : data) {
|
||||||
if (is_url_char(c)) {
|
if (is_url_char(c)) {
|
||||||
result += c;
|
result += c;
|
||||||
} else {
|
} else {
|
||||||
@ -126,6 +137,17 @@ string url_encode(Slice str) {
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
string buffer_to_hex(Slice buffer) {
|
||||||
|
const char *hex = "0123456789ABCDEF";
|
||||||
|
string res(2 * buffer.size(), '\0');
|
||||||
|
for (std::size_t i = 0; i < buffer.size(); i++) {
|
||||||
|
auto c = buffer.ubegin()[i];
|
||||||
|
res[2 * i] = hex[c & 15];
|
||||||
|
res[2 * i + 1] = hex[c >> 4];
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
template <class F>
|
template <class F>
|
||||||
@ -169,17 +191,6 @@ bool is_zero_or_one(unsigned char c) {
|
|||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
string buffer_to_hex(Slice buffer) {
|
|
||||||
const char *hex = "0123456789ABCDEF";
|
|
||||||
string res(2 * buffer.size(), '\0');
|
|
||||||
for (std::size_t i = 0; i < buffer.size(); i++) {
|
|
||||||
auto c = buffer.ubegin()[i];
|
|
||||||
res[2 * i] = hex[c & 15];
|
|
||||||
res[2 * i + 1] = hex[c >> 4];
|
|
||||||
}
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string zero_encode(Slice data) {
|
std::string zero_encode(Slice data) {
|
||||||
return x_encode(data, is_zero);
|
return x_encode(data, is_zero);
|
||||||
}
|
}
|
||||||
|
@ -303,7 +303,9 @@ T clamp(T value, T min_value, T max_value) {
|
|||||||
|
|
||||||
Result<string> hex_decode(Slice hex);
|
Result<string> hex_decode(Slice hex);
|
||||||
|
|
||||||
string url_encode(Slice str);
|
string hex_encode(Slice data);
|
||||||
|
|
||||||
|
string url_encode(Slice data);
|
||||||
|
|
||||||
// run-time checked narrowing cast (type conversion):
|
// run-time checked narrowing cast (type conversion):
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user