1e5d0e473Sopenharmony_ci/* 2e5d0e473Sopenharmony_ci * Copyright (C) 2021 Huawei Device Co., Ltd. 3e5d0e473Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4e5d0e473Sopenharmony_ci * you may not use this file except in compliance with the License. 5e5d0e473Sopenharmony_ci * You may obtain a copy of the License at 6e5d0e473Sopenharmony_ci * 7e5d0e473Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8e5d0e473Sopenharmony_ci * 9e5d0e473Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10e5d0e473Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11e5d0e473Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12e5d0e473Sopenharmony_ci * See the License for the specific language governing permissions and 13e5d0e473Sopenharmony_ci * limitations under the License. 14e5d0e473Sopenharmony_ci */ 15e5d0e473Sopenharmony_ci 16e5d0e473Sopenharmony_ci#include "string_utils.h" 17e5d0e473Sopenharmony_ci 18e5d0e473Sopenharmony_ci#include <sstream> 19e5d0e473Sopenharmony_ci#include <string_ex.h> 20e5d0e473Sopenharmony_ci 21e5d0e473Sopenharmony_ci#include "cstddef" 22e5d0e473Sopenharmony_ci#include "cstdint" 23e5d0e473Sopenharmony_ci#include "cstdlib" 24e5d0e473Sopenharmony_ci#include "ostream" 25e5d0e473Sopenharmony_ci#include "string" 26e5d0e473Sopenharmony_ci#include "telephony_log_wrapper.h" 27e5d0e473Sopenharmony_ci#include "vector" 28e5d0e473Sopenharmony_ci 29e5d0e473Sopenharmony_cinamespace OHOS { 30e5d0e473Sopenharmony_cinamespace Telephony { 31e5d0e473Sopenharmony_cistatic constexpr uint8_t HEX_OFFSET = 4; 32e5d0e473Sopenharmony_cistatic constexpr uint8_t STEP_2BIT = 2; 33e5d0e473Sopenharmony_cistatic constexpr char HEX_TABLE[] = "0123456789ABCDEF"; 34e5d0e473Sopenharmony_ci 35e5d0e473Sopenharmony_ciStringUtils::StringUtils() {} 36e5d0e473Sopenharmony_ci 37e5d0e473Sopenharmony_ciStringUtils::~StringUtils() {} 38e5d0e473Sopenharmony_ci 39e5d0e473Sopenharmony_ciuint16_t StringUtils::HexCharToInt(char c) 40e5d0e473Sopenharmony_ci{ 41e5d0e473Sopenharmony_ci const uint8_t decimal = 10; 42e5d0e473Sopenharmony_ci if (c >= '0' && c <= '9') { 43e5d0e473Sopenharmony_ci return (c - '0'); 44e5d0e473Sopenharmony_ci } 45e5d0e473Sopenharmony_ci if (c >= 'A' && c <= 'F') { 46e5d0e473Sopenharmony_ci return (c - 'A' + decimal); 47e5d0e473Sopenharmony_ci } 48e5d0e473Sopenharmony_ci if (c >= 'a' && c <= 'f') { 49e5d0e473Sopenharmony_ci return (c - 'a' + decimal); 50e5d0e473Sopenharmony_ci } 51e5d0e473Sopenharmony_ci return 0; 52e5d0e473Sopenharmony_ci} 53e5d0e473Sopenharmony_ci 54e5d0e473Sopenharmony_cistd::string StringUtils::StringToHex(const std::string &data) 55e5d0e473Sopenharmony_ci{ 56e5d0e473Sopenharmony_ci std::stringstream ss; 57e5d0e473Sopenharmony_ci for (std::string::size_type i = 0; i < data.size(); ++i) { 58e5d0e473Sopenharmony_ci unsigned char temp = static_cast<unsigned char>(data[i]) >> HEX_OFFSET; 59e5d0e473Sopenharmony_ci ss << HEX_TABLE[temp] << HEX_TABLE[static_cast<unsigned char>(data[i]) & 0xf]; 60e5d0e473Sopenharmony_ci } 61e5d0e473Sopenharmony_ci return ss.str(); 62e5d0e473Sopenharmony_ci} 63e5d0e473Sopenharmony_ci 64e5d0e473Sopenharmony_cistd::string StringUtils::StringToHex(const char *data, int byteLength) 65e5d0e473Sopenharmony_ci{ 66e5d0e473Sopenharmony_ci std::stringstream ss; 67e5d0e473Sopenharmony_ci for (int i = 0; i < byteLength; ++i) { 68e5d0e473Sopenharmony_ci unsigned char temp = static_cast<unsigned char>(data[i]) >> HEX_OFFSET; 69e5d0e473Sopenharmony_ci ss << HEX_TABLE[temp] << HEX_TABLE[static_cast<unsigned char>(data[i]) & 0xf]; 70e5d0e473Sopenharmony_ci } 71e5d0e473Sopenharmony_ci return ss.str(); 72e5d0e473Sopenharmony_ci} 73e5d0e473Sopenharmony_ci 74e5d0e473Sopenharmony_cistd::string StringUtils::StringToHex(const std::vector<uint8_t> &data) 75e5d0e473Sopenharmony_ci{ 76e5d0e473Sopenharmony_ci std::stringstream ss; 77e5d0e473Sopenharmony_ci for (std::size_t i = 0; i < data.size(); ++i) { 78e5d0e473Sopenharmony_ci unsigned char temp = static_cast<unsigned char>(data[i]) >> HEX_OFFSET; 79e5d0e473Sopenharmony_ci ss << HEX_TABLE[temp] << HEX_TABLE[static_cast<unsigned char>(data[i]) & 0xf]; 80e5d0e473Sopenharmony_ci } 81e5d0e473Sopenharmony_ci return ss.str(); 82e5d0e473Sopenharmony_ci} 83e5d0e473Sopenharmony_ci 84e5d0e473Sopenharmony_cistd::string StringUtils::HexToString(const std::string &str) 85e5d0e473Sopenharmony_ci{ 86e5d0e473Sopenharmony_ci std::string result; 87e5d0e473Sopenharmony_ci uint8_t hexDecimal = 16; 88e5d0e473Sopenharmony_ci uint8_t hexStep = 2; 89e5d0e473Sopenharmony_ci if (str.length() <= 0) { 90e5d0e473Sopenharmony_ci return result; 91e5d0e473Sopenharmony_ci } 92e5d0e473Sopenharmony_ci for (size_t i = 0; i < str.length() - 1; i += STEP_2BIT) { 93e5d0e473Sopenharmony_ci std::string byte = str.substr(i, hexStep); 94e5d0e473Sopenharmony_ci char chr = 0; 95e5d0e473Sopenharmony_ci long strTemp = strtol(byte.c_str(), nullptr, hexDecimal); 96e5d0e473Sopenharmony_ci if (strTemp > 0) { 97e5d0e473Sopenharmony_ci chr = static_cast<char>(strTemp); 98e5d0e473Sopenharmony_ci } 99e5d0e473Sopenharmony_ci result.push_back(chr); 100e5d0e473Sopenharmony_ci } 101e5d0e473Sopenharmony_ci return result; 102e5d0e473Sopenharmony_ci} 103e5d0e473Sopenharmony_ci 104e5d0e473Sopenharmony_cistd::vector<uint8_t> StringUtils::HexToByteVector(const std::string &str) 105e5d0e473Sopenharmony_ci{ 106e5d0e473Sopenharmony_ci std::vector<uint8_t> ret; 107e5d0e473Sopenharmony_ci int sz = static_cast<int>(str.length()); 108e5d0e473Sopenharmony_ci if (sz <= 0) { 109e5d0e473Sopenharmony_ci return ret; 110e5d0e473Sopenharmony_ci } 111e5d0e473Sopenharmony_ci for (int i = 0; i < (sz - 1); i += STEP_2BIT) { 112e5d0e473Sopenharmony_ci auto temp = static_cast<uint8_t>((HexCharToInt(str.at(i)) << HEX_OFFSET) | HexCharToInt(str.at(i + 1))); 113e5d0e473Sopenharmony_ci ret.push_back(temp); 114e5d0e473Sopenharmony_ci } 115e5d0e473Sopenharmony_ci return ret; 116e5d0e473Sopenharmony_ci} 117e5d0e473Sopenharmony_ci 118e5d0e473Sopenharmony_cistd::string StringUtils::ToUtf8(const std::u16string &str16) 119e5d0e473Sopenharmony_ci{ 120e5d0e473Sopenharmony_ci if (str16.empty()) { 121e5d0e473Sopenharmony_ci std::string ret; 122e5d0e473Sopenharmony_ci return ret; 123e5d0e473Sopenharmony_ci } 124e5d0e473Sopenharmony_ci return Str16ToStr8(str16); 125e5d0e473Sopenharmony_ci} 126e5d0e473Sopenharmony_ci 127e5d0e473Sopenharmony_cistd::u16string StringUtils::ToUtf16(const std::string &str) 128e5d0e473Sopenharmony_ci{ 129e5d0e473Sopenharmony_ci if (str.empty()) { 130e5d0e473Sopenharmony_ci std::u16string ret; 131e5d0e473Sopenharmony_ci return ret; 132e5d0e473Sopenharmony_ci } 133e5d0e473Sopenharmony_ci return Str8ToStr16(str); 134e5d0e473Sopenharmony_ci} 135e5d0e473Sopenharmony_ci 136e5d0e473Sopenharmony_cibool StringUtils::IsEmpty(const std::string &str) 137e5d0e473Sopenharmony_ci{ 138e5d0e473Sopenharmony_ci if (str.empty()) { 139e5d0e473Sopenharmony_ci return true; 140e5d0e473Sopenharmony_ci } 141e5d0e473Sopenharmony_ci std::string strTemp = TrimStr(str); 142e5d0e473Sopenharmony_ci return strTemp.empty() || strlen(strTemp.c_str()) == 0; 143e5d0e473Sopenharmony_ci} 144e5d0e473Sopenharmony_ci} // namespace Telephony 145e5d0e473Sopenharmony_ci} // namespace OHOS