Оператор 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
);
Ссылка: Типы данных Oracle .
Строка типа «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 бит, поэтому его не очень удобно переносить, но вы можете взять его отсюда.)
Вот другое решение, в основном вдохновленное тем @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();
}
Длина была обязательным параметром в намеченном
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); }
Простейший пример с использованием стандартной библиотеки.
#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();
}