首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C++ 字符串進制轉換:數字字符串存二進制讀十六進制實現

     編輯:程式設計綜合問答

需求澄清

字符串 "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") 只是改變**顯示格式**
  • 大數值用 64 位:20150902153100 > 2^31,必須用 uint64_t / unsigned long long / long (Java)
  • 字符串解析指定基數:stoull(str, nullptr, 16) 解析十六進制字符串

Java 對應實現


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);  // 還原

結論:直接使用標準庫格式化功能,無需手動實現位操作。核心認知:**存儲是二進制,展示才有進制之分**。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved