十六進制字串(常帶 0x 前綴)與數值互轉是嵌入式開發、網路協定、檔案格式解析常見需求。.NET 內建 Convert.ToInt32(string, 16)、int.ToString("X") 等方法,但本文展示手動實作演算法以深入理解位元運算原理,並處理 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());
}
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);
}
| 操作 | 內建方法 | 範例 |
|---|---|---|
| Hex 字串 → int | Convert.ToInt32(s, 16) | Convert.ToInt32("1A3", 16) == 419 |
| Hex 字串 → long | Convert.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 字元 |
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手動實作十六進制轉換有助於理解位元運算與數值表示本質,但生產代碼應優先使用 .NET 高度優化、經測試的內建方法(Convert、ToString("X")、BitConverter)。浮點數十六進制交換需遵循 IEEE 754 位元模式,而非數值展開。