目录
1、Encoding类介绍
2、几个常用转换函数介绍
3、"012"字符串和byte[]={48,49,50}或者是{0x30,0x31,0x32}之间的转换
4、字符串和16进制字节数组转换
5、16进制和汉字转换
1、Enconding类介绍
构造函数:Enconding()
属性:ASCII//7位表示
Default
方法:Convert(Encoding, Encoding, Byte[]) 将整个字节数组从一种编码转换为另一种编码。
GetBytes(Char[]) 将指定字符数组中的所有字符编码为一个字节序列。
GetBytes(String) 将指定字符串中的所有字符编码为一个字节序列
GetString(Byte[]) 将指定字节数组中的所有字节解码为一个字符串。
2、几个常用转换函数介绍
Convert.ToByte("254")//转换为254默认情况下为10进制即Convert.ToByte("254",10)
Convert.ToByte("d3“,16)/转换为211
Convert.ToString(211)转换为"211"默认情况下是10进制
Convert.ToString(211,16)转换为"d3"
Convert.ToString("X2")
ToString("X2") 为C#中的字符串格式控制符
X为 十六进制
2为 每次都是两位数
比如 0x0A ,若没有2,就只会输出0xA
假设有两个数10和26,正常情况十六进制显示0xA、0x1A,这样看起来不整齐,为了好看,可以指定"X2",这样显示出来就是:0x0A、0x1A。
100.ToString("X2")//64
211.ToString("X2")//D3
3"012"字符串和byte[]={48,49,50}或者是{0x30,0x31,0x32}之间的转换
3.1、"012"字符串转换为byte[]{48,49,50}
string str="012";
byte[] byteArray=System.Text.Encoding.Default.GetBytes(str);
foreach(byte b in byteArray)
{
Console.WriteLine("{0}",b);
}
输出为:48
49
50
3.2、byte[]{48,49,50}转换为“012"字符串
byte[] byteArray=new byte[]{48,49,50};
string str=System.Text.Encoding.ASCII.GetString(byteArray);
Console.WriteLine(str);
输出为:012
4、字符串和16进制字节数组转换
实例代码
using System; using System.Text; public class test { public static void Main() { Encoding ascii = Encoding.Default; string str="1234"; string str1=StringToHexString(str,ascii); Console.WriteLine(str1); string str2=HexStringToString(str1,ascii); Console.WriteLine(str2); string str3="01 02 03 04 05 a3 3a d3 3d"; byte[] byteArray=strToToHexByte(str3); foreach(byte b in byteArray) { Console.WriteLine(b.ToString()); } string str4=byteToHexStr(byteArray); Console.WriteLine(str3); } public static string StringToHexString(string s,Encoding encode) { byte[] b = encode.GetBytes(s);//按照指定编码将string编程字节数组 string result = string.Empty; for (int i = 0; i < b.Length; i++)//逐字节变为16进制字符,以%隔开 { result += "%"+Convert.ToString(b[i], 16); } return result; } private static string HexStringToString(string hs, Encoding encode) { //以%分割字符串,并去掉空字符 string[] chars = hs.Split(new char[]{'%'},StringSplitOptions.RemoveEmptyEntries); byte[] b = new byte[chars.Length]; //逐个字符变为16进制字节数据 for (int i = 0; i < chars.Length; i++) { b[i] = Convert.ToByte(chars[i], 16); } //按照指定编码将字节数组变为字符串 return encode.GetString(b); } /// <summary> /// 字符串转16进制字节数组 /// </summary> /// <param name="hexString"></param> /// <returns></returns> private static byte[] strToToHexByte(string hexString) { hexString = hexString.Replace(" ", ""); if ((hexString.Length % 2) != 0) hexString += " "; byte[] returnBytes = new byte[hexString.Length / 2]; for (int i = 0; i < returnBytes.Length; i++) returnBytes[i] = Convert.ToByte(hexString.Substring(i * 2, 2), 16); return returnBytes; } /// <summary> /// 字节数组转16进制字符串 /// </summary> /// <param name="bytes"></param> /// <returns></returns> public static string byteToHexStr(byte[] bytes) { string returnStr = ""; if (bytes != null) {for (int i = 0; i < bytes.Length; i++) { returnStr += bytes[i].ToString("X2"); } } return returnStr; } }
实验结果:
结果分析:
1、字符串”1234”先变为byte数组为49,50,51,52,;再按16进制转换为0x31,0x32,0x33,0x34,再tostring();
2、字符串%31%32%33%34变为字符串数组31,32,33,34,再16机制转换为49,50,51,52,再getString(byte)按编码发送转换为1234;
3、字符串str3="01 02 03 04 05 a3 3a d3 3d";按两个字符为单位转换为1,2,3,4,5,163,58,211,61即0x01,0x02,0xa3,0x3a,0xd3,0x3d
4、将byte数组{0x01,0x02,0xa3,0x3a,0xd3,0x3d即{1,2,3,4,5,163,58,211,61},按一个byte元素转换为2个字符,即211转换为“d3"两个字符;
5、16进制和汉字转换
从汉字转换到16进制 /// <summary> /// 从汉字转换到16进制 /// </summary> /// <param name="s"></param> /// <param name="charset">编码,如"utf-8","gb2312"</param> /// <param name="fenge">是否每字符用逗号分隔</param> /// <returns></returns> public static string ToHex(string s, string charset, bool fenge) { if ((s.Length % 2) != 0) { s += " ";//空格//throw new ArgumentException("s is not valid chinese string!"); } System.Text.Encoding chs = System.Text.Encoding.GetEncoding(charset); byte[] bytes = chs.GetBytes(s); string str = ""; for (int i = 0; i < bytes.Length; i++) { str += string.Format("{0:X}", bytes[i]); if (fenge && (i != bytes.Length - 1)) { str += string.Format("{0}", ","); } } return str.ToLower(); } 16进制转换成汉字 ///<summary> /// 从16进制转换成汉字 /// </summary> /// <param name="hex"></param> /// <param name="charset">编码,如"utf-8","gb2312"</param> /// <returns></returns> public static string UnHex(string hex, string charset) { if (hex == null) throw new ArgumentNullException("hex"); hex = hex.Replace(",", ""); hex = hex.Replace(" ", ""); hex = hex.Replace("\", ""); hex = hex.Replace(" ", ""); if (hex.Length % 2 != 0) { hex += "20";//空格 } // 需要将 hex 转换成 byte 数组。 byte[] bytes = new byte[hex.Length / 2]; for(int i = 0; i < bytes.Length; i++) { try { // 每两个字符是一个 byte。 bytes[i] = byte.Parse(hex.Substring(i * 2, 2), System.Globalization.NumberStyles.HexNumber); } catch { // Rethrow an exception with custom message. throw new ArgumentException("hex is not a valid hex number!", "hex"); } } System.Text.Encoding chs = System.Text.Encoding.GetEncoding(charset); return chs.GetString(bytes); }
补充:
1.请问c#中如何将十进制数的字符串转化成十六进制数的字符串 //十进制转二进制 Console.WriteLine("十进制166的二进制表示: "+Convert.ToString(166, 2)); //十进制转八进制 Console.WriteLine("十进制166的八进制表示: "+Convert.ToString(166, 8)); //十进制转十六进制 Console.WriteLine("十进制166的十六进制表示: "+Convert.ToString(166, 16)); //二进制转十进制 Console.WriteLine("二进制 111101 的十进制表示: "+Convert.ToInt32("111101", 2)); //八进制转十进制 Console.WriteLine("八进制 44 的十进制表示: "+Convert.ToInt32("44", 8)); //十六进制转十进制 Console.WriteLine("十六进制 CC的十进制表示: "+Convert.ToInt32("CC", 16));