字符串 "20150902153100" 代表十進制數值 20150902153100。需求:「以二進制方式存入,再轉成十六進制讀出」。
本質:整數在記憶體中**本身就是二進制存儲**。轉換只是**展示格式**不同。無需手動拆解位操作,直接用標準庫格式化輸出。
#include
#include
#include
#include
#include
int main() {
std::string str = "20150902153100";
// 1. 字符串 → 無符號 64 位整數 (支援超大數值)
uint64_t value = std::stoull(str); // C++11
// 2. 整數 → 十六進制字符串 (大寫、帶前綴、固定寬度)
std::stringstream ss;
ss << "0x" << std::uppercase << std::hex << std::setw(16) << std::setfill('0') << value;
std::string hexStr = ss.str();
std::cout << "原始: " << str << std::endl;
std::cout << "十六進制: " << hexStr << std::endl;
// 輸出: 0x00000124F3E8C7FC
// 3. 驗證:十六進制字符串 → 整數 → 十進制
uint64_t value2 = std::stoull(hexStr, nullptr, 16);
std::cout << "還原: " << value2 << std::endl; // 20150902153100
return 0;
}
#include
#include
#include
std::string toHexManual(uint64_t value) {
if (value == 0) return "0x00";
const char* hexChars = "0123456789ABCDEF";
std::string result = "0x";
std::vector digits;
while (value > 0) {
digits.push_back(hexChars[value & 0xF]); // 取低 4 位
value >>= 4; // 右移 4 位
}
// 高位在前,需反轉
for (auto it = digits.rbegin(); it != digits.rend(); ++it) {
result += *it;
}
// 補齊偶數位
if ((result.length() - 2) % 2 != 0) result.insert(2, "0");
return result;
}
std::hex、printf("%llx")、String.format("%X") 只是改變**顯示格式**20150902153100 > 2^31,必須用 uint64_t / unsigned long long / long (Java)stoull(str, nullptr, 16) 解析十六進制字符串
String str = "20150902153100";
long value = Long.parseLong(str); // 十進制字符串 → long
String hexStr = "0x" + Long.toHexString(value).toUpperCase(); // → 十六進制
System.out.println(hexStr); // 0x124F3E8C7FC
long value2 = Long.parseLong(hexStr.substring(2), 16); // 還原
結論:直接使用標準庫格式化功能,無需手動實現位操作。核心認知:**存儲是二進制,展示才有進制之分**。