C#中实现字符串进制转换的最佳实践
在C#开发中,经常需要将数据在十进制、二进制、十六进制以及字符串类型之间进行转换。本文汇总了最常用的内置转换方法,包括使用 Convert 类处理整数进制的互转,利用 BitConverter 类处理浮点数与字节数组,以及通过 PadLeft 等方法控制输出格式的实战示例。
C# 通用进制转换实现
如果需要封装一个支持多进制互相转换的工具方法,可以通过定义输入来源基数和目标基数来实现逻辑分发。以下代码展示了如何将二进制、八进制、十进制和十六进制字符串转换为指定的其他进制格式。
public string ConvertGenericBinary(string input, byte fromType, byte toType)
{
string output = input;
switch (fromType)
{
case 2:
// 从二进制转换
output = Convert.ToString(Convert.ToInt32(input, 2), toType);
break;
case 8:
// 从八进制转换
output = Convert.ToString(Convert.ToInt32(input, 8), toType);
break;
case 10:
// 从十进制转换
output = Convert.ToString(Convert.ToInt32(input), toType);
break;
case 16:
// 从十六进制转换
output = Convert.ToString(Convert.ToInt32(input, 16), toType);
break;
}
return output;
}
上述逻辑中,核心思路是先将输入字符串解析为内部的整型数值,再将该数值格式化为目标进制的字符串。这种方法避免了冗长的多重判断分支。
基础进制转换速查
掌握以下核心 API 是处理进制转换的基础:
数字转字符串:Convert.ToString
将数字转换为指定基数的字符串表示形式。
// 十进制 3 转为二进制字符串 "11"
string binStr = Convert.ToString(3, 2);
// 十进制 15 转为十六进制字符串 "f"
string hexStr = Convert.ToString(15, 16);
// 或者使用格式化方法
string hexStr2 = string.Format("{0:x}", 15); // 结果为小写 "f"
字符串转数字:Convert.ToInt32
将指定基数的字符串表示形式转换为等价的 32 位有符号整数。
// 二进制字符串 "1111" 转为十进制整数 15
int val = Convert.ToInt32("1111", 2);
// 十六进制字符串 "F" 或 "f" 转为整数 15
int valHex = Convert.ToInt32("F", 16);
// 注意区分大小写通常不影响数值结果,但需符合规范
常用操作技巧与补充
1. 字符串位数补齐
在数据处理时,常要求固定长度的进制串,左侧不足可用 PadLeft,右侧可用 PadRight。
// 十进制 3 转为二进制,左侧补零至4位,结果为 "0011"
string padded = Convert.ToString(3, 2).PadLeft(4, '0');
// 十六进制 F 转为二进制,左侧补零至8位,结果为 "00001111"
string paddedHex = Convert.ToString(0xF, 2).PadLeft(8, '0');
2. 字符与整数的 ASCII 转换
字符在计算机内部以整数(ASCII码)存储,可进行相互转换。
// 字符 'A' 转换为整数 65
int asciiVal = Convert.ToInt32('A');
// 字符串中取首字母并转ASCII
string text = "AB";
int firstCharAscii = Convert.ToInt32(text[0]); // 结果为 65
3. int 与 string 的标准互转
// int 49 转字符串 "49"
string str = (49).ToString();
// 字符串 "31" 转 int 31
int i = Convert.ToInt32("31");
4. Byte/Short 与 Int 的类型转换
// byte 转 int
byte bt = 0x31; // 49
int n = Convert.ToInt32(bt);
// 带前缀格式的输出
int num = 49;
string hexWithPrefix = num.ToString("x"); // 输出 "31",若需要前缀可使用自定义字符串格式化
// 实际上 .NET 没有直接带 0x 前缀的内置标准格式化,通常手动拼接或使用 ToString("X") 后加 "0x"
高级类型转换:浮点数与字节数组
当涉及网络传输、文件读取或底层协议解析时,经常需要将浮点数(float/double)转换为字节数组或反之,此时推荐使用 BitConverter 类。
浮点数与字节数组互转
// 浮点数转十六进制字节串
float f = 0.68f;
// GetBytes 返回 byte[],ToString 默认用 "-" 连接
string bytesStr = BitConverter.ToString(BitConverter.GetBytes(f));
// 去除连字符得到纯十六进制字符串
string cleanHex = bytesStr.Replace("-", ""); // 如 "7B142E3F"
// 字节数组转浮点数
byte[] bt = new byte[4] { 0x3F, 0x2E, 0x14, 0x7B }; // 注意顺序可能受平台字节序影响
float result = BitConverter.ToSingle(bt, 0);
ushort[] 与 float 的组合转换
在某些特定协议中,浮点数可能被拆分为两个 ushort 传输。
// ushort 数组组合转 float
ushort[] valArr = new ushort[2];
valArr[0] = ...; // 低字节部分
valArr[1] = ...; // 高字节部分
List<byte> allBytes = new List<byte>();
allBytes.AddRange(BitConverter.GetBytes(valArr[0]));
allBytes.AddRange(BitConverter.GetBytes(valArr[1]));
float finalFloat = BitConverter.ToSingle(allBytes.ToArray(), 0);
// float 拆分为 ushort 数组
float value = 1.0f;
byte[] rawBytes = BitConverter.GetBytes(value);
ushort lowOrderValue = BitConverter.ToUInt16(rawBytes, 0); // 注意字节序
ushort highOrderValue = BitConverter.ToUInt16(rawBytes, 2);
完成判断与注意事项
- 异常处理:
Convert.ToInt32(str, base)在传入非法字符(如二进制字符串含 '2')时会抛出异常,实际生产中建议结合int.TryParse或正则校验。 - 大小端模式: 在使用
BitConverter处理字节数组与数值互转时,需注意不同 CPU 架构的字节序(Endianness)差异,跨平台交互时需确认字节排列顺序。 - 返回值类型:
Convert.ToString返回的是string,Convert.ToInt32返回的是int,根据业务需求选择是否需要进行二次装箱或转换。
以上就是 C# 实现字符串及数值进制转换方法的详细内容,更多关于 C# 数据类型转换及位运算的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









