如何将带前导零的 unsigned long long 转换为字符串?

How to convert an unsigned long long with leading zeroes to string?

我有一个函数应该将十六进制格式的 unsigned long long 作为参数。我正在尝试将此参数转换为字符串以检查它是否由 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

你知道一个数字应该有多少个字符吗?前导零的数量可以是无限的。我认为这对你有帮助

int character_count = 10;
oss << hex << setfill('0') << setw(character_count) << value;

用十六进制数表示的 unsigned long long 的长度,包括前导零,是:

sizeof(unsigned long long)*2

由于我们包括前导零,因此 unsigned long long 的值不相关。

你无法知道 "entered by the user" 的位数,除非你已经通过 "array" (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
因为如果有人调用函数的类型不是 shortintlonglong long(resp. unsigned),函数将是坏了。