Как преобразовать длинную строку без знака с ведущими нулями в строку? - PullRequest
0 голосов
/ 20 сентября 2019

У меня есть функция, которая должна принимать в качестве параметра длинную без знака в шестнадцатеричном формате.Я пытаюсь преобразовать этот параметр в строку, чтобы проверить, состоит ли он из 16 цифр или нет, но у меня возникают проблемы с ведущими нулями

template <typename T>
static string to_string(const T& value) {
stringstream oss;
oss << hex << setprecision(16) << value;
return oss.str();
}

int main(int argc, char** argv) {

    unsigned long long pattern1 = 0x0000001000000002;
    unsigned long long pattern2 = 0x0FFFFFFFFFFFFFFFF;

    cout << "Pattern 1 = " << to_string(pattern1) << endl;
    cout << "Pattern 2 = " << to_string(pattern2) << endl;

    return 0;
}

Я хочу, чтобы шаблон 1 был преобразованс нулями, чтобы иметь возможность проверить его длину, но это выход.Я пытался использовать заданную точность, но, похоже, не помогло

Pattern 1 = 1000000002
Pattern 2 = ffffffffffffffff

Ответы [ 3 ]

2 голосов
/ 20 сентября 2019

Вы знаете, сколько символов должно быть в числе?Количество ведущих нулей может быть бесконечным.Я думаю, что это поможет вам

int character_count = 10;
oss << hex << setfill('0') << setw(character_count) << value;
1 голос
/ 20 сентября 2019

Вы не можете знать количество цифр, которое было «введено пользователем» , за исключением случаев, когда вы уже прочитали его через «массив» (char*, std::string, ...).

Если у вас есть unsigned long long, размер переменной в любом случае будет 8 байт:

unsigned long long a = 0x1; // This will internally be: 0x0000000000000001

Теперь, если вы хотите вернуть начальные нули изфактический тип в std::string, я думаю, что следующее должно помочь (как уже упоминалось в других ответах):

template <typename T>
std::string to_string(const T & val)
{
    std::stringstream oss;
    oss << std::hex << std::setfill('0') << std::setw(sizeof(T)*2) << val;
    return oss.str();
}

Но, возможно, было бы лучше перегрузить функцию для любых целочисленных типов, которые вы хотитеиспользовать вместо template.Потому что если кто-то вызывает функцию с типом, который не является short, int, long, long long (соответственно unsigned), функция будет нарушена.

1 голос
/ 20 сентября 2019

Длина unsigned long long, представленного в виде шестнадцатеричного числа, включая ведущие нули, составляет:

sizeof(unsigned long long)*2

Поскольку мы включаем ведущие нули, значение unsigned long long не имеет значения.

...