首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# 十六進制字串與數值雙向轉換:整數、Double 完整實作

     編輯:關於C語言

轉換需求分析

十六進制字串(常帶 0x 前綴)與數值互轉是嵌入式開發、網路協定、檔案格式解析常見需求。.NET 內建 Convert.ToInt32(string, 16)、int.ToString("X") 等方法,但本文展示手動實作演算法以深入理解位元運算原理,並處理 double 型別轉換。

十六進制字串 → Double


private double HexToDouble(string hexString) {
    if (string.IsNullOrEmpty(hexString)) return 0;

    // 移除 0x 前綴
    string data = hexString.StartsWith("0x") ? hexString.Substring(2) : hexString;
    char[] digits = data.ToCharArray();
    double result = 0;
    double baseVal = 16;  // 八進制改為 8

    for (int i = 0; i < digits.Length; i++) {
        char c = digits[i];
        int digitVal = c switch {
            '0' => 0, '1' => 1, '2' => 2, '3' => 3, '4' => 4,
            '5' => 5, '6' => 6, '7' => 7, '8' => 8, '9' => 9,
            'A' or 'a' => 10, 'B' or 'b' => 11, 'C' or 'c' => 12,
            'D' or 'd' => 13, 'E' or 'e' => 14, 'F' or 'f' => 15,
            _ => 0
        };
        int power = digits.Length - i - 1;
        result += digitVal * Math.Pow(baseVal, power);
    }
    return result;
}

演算法解析

位權展開:0x1A3 = 1×16² + 10×16¹ + 3×16⁰ = 256 + 160 + 3 = 419

  • 逐字元解析,支援大小寫
  • 使用 Math.Pow 計算位權(效能較低,教學用途)
  • 生產環境建議用位移運算:result = (result << 4) | digitVal

整數 → 十六進制字串(手動實作)


private string IntToHex(int value) {
    if (value == 0) return "0x0";

    const string hexChars = "0123456789ABCDEF";
    var digits = new List();

    // 正數處理
    uint uval = (uint)value;  // 統一用無號處理位元
    while (uval > 0) {
        digits.Add(hexChars[(int)(uval & 0xF)]);
        uval >>= 4;
    }

    // 負數(補碼)自動處理:uint 轉換保留位元模式
    digits.Reverse();
    return "0x" + new string(digits.ToArray());
}

優化版:位元運算替代 Math.Pow


private string IntToHexOptimized(int value) {
    if (value == 0) return "0x0";
    uint uval = (uint)value;
    char[] buffer = new char[8];  // int 固定 8 位十六進制
    int pos = 8;
    while (uval > 0) {
        buffer[--pos] = "0123456789ABCDEF"[(int)(uval & 0xF)];
        uval >>= 4;
    }
    return "0x" + new string(buffer, pos, 8 - pos);
}

.NET 內建方法對比

操作內建方法範例
Hex 字串 → intConvert.ToInt32(s, 16)Convert.ToInt32("1A3", 16) == 419
Hex 字串 → longConvert.ToInt64(s, 16)
int → Hex 字串value.ToString("X")419.ToString("X") == "1A3"
int → Hex 字串(大寫、定寬)value.ToString("X8")419.ToString("X8") == "000001A3"
byte[] → Hex 字串BitConverter.ToString(bytes).Replace("-", "")
Hex 字串 → byte[]自行解析每 2 字元

Double/Float 十六進制表示

IEEE 754 浮點數十六進制表示對應記憶體位元模式:


// Double → Hex (IEEE 754)
double d = 3.14;
long bits = BitConverter.DoubleToInt64Bits(d);
string hex = bits.ToString("X16");  // "40091EB851EB851F"

// Hex → Double
long bits2 = Convert.ToInt64("40091EB851EB851F", 16);
double d2 = BitConverter.Int64BitsToDouble(bits2);  // 3.14

常見陷阱

  • 負數處理:有號整數轉十六進制需決定是輸出補碼形式(如 0xFFFFFFFF)還是帶負號(-0x1)
  • 前綴一致性:統一使用 0x 或無前綴,解析時自動容忍
  • 大小寫:解析時 ToUpper() 或 char.ToUpperInvariant()
  • 溢位:Convert.ToInt32 遇超出 Int32.MaxValue 拋例外,改用 ToInt64 或 BigInteger
  • 浮點精度:十六進制字串無法精確表示十進制小數(如 0.1),僅適合記憶體位元模式交換

總結

手動實作十六進制轉換有助於理解位元運算與數值表示本質,但生產代碼應優先使用 .NET 高度優化、經測試的內建方法(Convert、ToString("X")、BitConverter)。浮點數十六進制交換需遵循 IEEE 754 位元模式,而非數值展開。

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