C++ преобразовывает строку в шестнадцатеричный и наоборот

Оператор CREATE TABLE объявляет столбец DURACION как тип данных INTERVAL

INTERVAL не является допустимым типом данных. Вы можете использовать INTERVAL YEAR TO MONTH или INTERVAL DAY TO SECOND (с различной точностью).

Рассмотрим, например:

CREATE TABLE EVENTO(
    ID_EVENTO NUMBER PRIMARY KEY,
    ID_COMPLEJO NUMBER NOT NULL,
    N_COMISARIOS NUMBER,
    FECHA_EVENTO DATE,
    N_PARTICIPANTES NUMBER,
    DURACION INTERVAL YEAR TO MONTH,
    EQUIPAMIENTO VARCHAR2(255),
    FOREIGN KEY (ID_COMPLEJO) REFERENCES COMPLEJO
);

Демонстрация по DB Fiddle

Ссылка: Типы данных Oracle .

56
задан herohuyongtao 28 April 2014 в 17:18
поделиться

4 ответа

Строка типа «Hello World» в шестнадцатеричном формате: 48656C6C6F20576F726C64.

А, вот и все:

#include <string>

std::string string_to_hex(const std::string& input)
{
    static const char* const lut = "0123456789ABCDEF";
    size_t len = input.length();

    std::string output;
    output.reserve(2 * len);
    for (size_t i = 0; i < len; ++i)
    {
        const unsigned char c = input[i];
        output.push_back(lut[c >> 4]);
        output.push_back(lut[c & 15]);
    }
    return output;
}

#include <algorithm>
#include <stdexcept>

std::string hex_to_string(const std::string& input)
{
    static const char* const lut = "0123456789ABCDEF";
    size_t len = input.length();
    if (len & 1) throw std::invalid_argument("odd length");

    std::string output;
    output.reserve(len / 2);
    for (size_t i = 0; i < len; i += 2)
    {
        char a = input[i];
        const char* p = std::lower_bound(lut, lut + 16, a);
        if (*p != a) throw std::invalid_argument("not a hex digit");

        char b = input[i + 1];
        const char* q = std::lower_bound(lut, lut + 16, b);
        if (*q != b) throw std::invalid_argument("not a hex digit");

        output.push_back(((p - lut) << 4) | (q - lut));
    }
    return output;
}

(Предполагается, что у char 8 бит, поэтому его не очень удобно переносить, но вы можете взять его отсюда.)

75
ответ дан 26 November 2019 в 17:08
поделиться

Вот другое решение, в основном вдохновленное тем @fredoverflow.

/**
 * Return hexadecimal representation of the input binary sequence
 */
std::string hexitize(const std::vector<char>& input, const char* const digits = "0123456789ABCDEF")
{
    std::ostringstream output;

    for (unsigned char gap = 0, beg = input[gap]; gap < input.length(); beg = input[++gap])
        output << digits[beg >> 4] << digits[beg & 15];

    return output.str();
}

Длина была обязательным параметром в намеченном

0
ответ дан 26 November 2019 в 17:08
поделиться
string ToHex(const string& s, bool upper_case /* = true */)
{
    ostringstream ret;

    for (string::size_type i = 0; i < s.length(); ++i)
        ret << std::hex << std::setfill('0') << std::setw(2) << (upper_case ? std::uppercase : std::nouppercase) << (int)s[i];

    return ret.str();
}

int FromHex(const string &s) { return strtoul(s.c_str(), NULL, 16); }
27
ответ дан 26 November 2019 в 17:08
поделиться

Простейший пример с использованием стандартной библиотеки.

#include <iostream>
using namespace std;

int main()
{
  char c = 'n';
  cout << "HEX " << hex << (int)c << endl;  // output in hexadecimal
  cout << "ASC" << c << endl; // output in ascii
  return 0;
}

Для проверки вывода кодовая панель возвращает: 6e

, а онлайн-инструмент преобразования ascii в шестнадцатеричный формат также дает 6e. Так что работает.

Вы также можете сделать это:

template<class T> std::string toHexString(const T& value, int width) {
    std::ostringstream oss;
    oss << hex;
    if (width > 0) {
        oss << setw(width) << setfill('0');
    }
    oss << value;
    return oss.str();
}
8
ответ дан 26 November 2019 в 17:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: