应用场景1:
textbox中输入str=“200”(string类型),需转换为16进制hex=c8(byte、char、int类型)
解决方法:
利用Convert.ToByte(str)/.ToChar(str)/.ToInt16(str)/.ToInt32(str)/.ToInt64(str)
或者
byte/char/int.TryParse(str,out hex);会自动转换为16进制数据
例:
string mytime_str = time.Text;//textbox名为time
byte mytime_b;
byte.TryParse(mytime_str, out mytime_b);
//mytime_b = Convert.ToByte(mytime_str);
应用场景2:
textbox中输入str=“010203040506”(string类型),需转换为16进制数组(byte[]、char[]、int[]类型)
解决方法:
方法一:
首先利用str.Substring(指定字符位置, 指定长度)将字符串两两分组,再根据Convert.To或.TryParse可直接将字符串转换为对应的16进制byte/int/char的特点,将字符串两两转换为16进制byte/int/char
方法二:
首先将string类型字符串转换为byte[]/char[]/int[]类型数组(ASCII,非16进制)——利用Encoding.Default.GetBytes(str)/.GetChars(str)
或者
str.ToCharArray();
再根据ASCII转换表转换为16进制
注意:
1、Encoding.Default.GetBytes(str)/.GetChars(str)以及str.ToCharArray()将字符串转换为ASCII表中的16进制byte/char数组,而非实际数字对应的16进制,目前还没有找到把字符串直接变为16进制数组的函数
2、str.Replace("#", “”)可以替换无关字符串
例:
方法一(推荐使用)
private static byte[] strToToHexBytes(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;
}
方法二
public static byte[] StringToHexBytes(String s)
{
s = s.Replace(" ", "");
s = s.Replace("#", "");
byte[] b_ASCII = Encoding.Default.GetBytes(s);
byte[] b_Hex;
if (b_ASCII.Length%2==0)//偶数两个数字为一个字节
{
b_Hex = new byte[b_ASCII.Length / 2];
for (int j = 0; j < b_ASCII.Length; j++)
{
if ((b_ASCII[j] & 0xf0) == 0x40 | (b_ASCII[j] & 0xf0) == 0x60)
{
b_ASCII[j] = (byte)((b_ASCII[j] & 0x0f) - 0x01 + 0x0a);
}
else if ((b_ASCII[j] & 0xf0) == 0x30)
{
b_ASCII[j] = b_ASCII[j];
}
}
for (int i = 0; i < b_ASCII.Length / 2; i++)
{
b_Hex[i] = (byte)((b_ASCII[2 * i] << 4) | (b_ASCII[2 * i + 1] & 0x0f));
}
}
else//奇数一个数字为一个字节
{
b_Hex = new byte[b_ASCII.Length];
for (int j = 0; j < b_ASCII.Length; j++)
{
if ((b_ASCII[j] & 0xf0) == 0x40 | (b_ASCII[j] & 0xf0) == 0x60)
{
b_Hex[j] = (byte)((b_ASCII[j] & 0x0f) - 0x01 + 0x0a);
}
else if ((b_ASCII[j] & 0xf0) == 0x30)
{
b_Hex[j] = (byte)(b_ASCII[j] & 0x0f);
}
}
}
return b_Hex; }
应用场景3:
收到的byte/char/int/string类型数据在vs输出窗口中显示
解决方法:利用Console.WriteLine()/.Write()或者Debug.WriteLine()/.Write()
注意:
1、.WriteLine()换行,.Write()不换行
2、byte/char/int类型数据,默认按十进制输出,若按16进制显示则同场景4
例
string strFilter="00000000";
Console.WriteLine(strFilter);//显示"00000000"
//Debug.WriteLine(strFilter);
应用场景4:
收到的byte/char/int数组数据在vs输出窗口中按16进制显示
解决方法:
方法一(仅适用于byte数组数据):利用BitConverter.ToString(byte数组数据)函数将byte数组数据直接转换为16进制字符串
方法二:首先将byte/char/int数组数据利用.ToString(“X2”)函数逐个变为string类型再相加得到字符串,后通过Console.WriteLine()/.Write()或者Debug.WriteLine()/.Write()输出
注意:
1、.WriteLine()/.Write()函数并不能直接输出数组数据,只能输出单个数据且默认按十进制输出
2、目前还没有找到把16进制数组直接变为字符串的函数
例
方法一(仅适用于byte数组数据)
Console.WriteLine(BitConverter.ToString(new byte[] { 1, 13, 54 }).Replace("-", ""));
方法二
public static string byteToHexStr(byte[] bytes)
{
string returnStr = "";
if (bytes != null)
{
for (int i = 0; i < bytes.Length; i++)
{
returnStr += bytes[i].ToString("X2");
}
//foreach (byte b in bytes)
//{
//Console.WriteLine(b.ToString("X2")+" ");
//}
}
return returnStr;
}
主要用到函数:(@@指byte、char、int)
Convert.To@@()、Convert.ToString()
@@ .TryParse(string类型值,out @@类型值) ;(只可将string类型值转换为16进制数据,不可转换为16进制数组)
string类型值.Substring();
Encoding.Default.GetBytes( string类型值)/ .GetChars( string类型值)
string类型值.ToCharArray();(只可转换为ASCII对应的16进制数组数据)
Console.WriteLine()/.Write()
Debug.WriteLine()/.Write();(只可输出10进制@@数据以及字符串,不可输出@@数组数据)
BitConverter.ToString(new byte[] { 1, 13, 54 }).Replace("-", “”)
@@ .ToString();
参考:
.NET(C#): 多种输出字节数组的方法(场景4方法一)
C# 16进制与字符串、字节数组之间的转换
C#在控制台应用程序中显示输出字节型数据(场景4方法二)
Console.WriteLine()/.Write()输出数据格式
Tostring 格式化输出字符串全解