c#string字符串与16进制byte字节和16进制byte[]字节数组转换

应用场景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 格式化输出字符串全解

发布了30 篇原创文章 · 获赞 3 · 访问量 900

猜你喜欢

转载自blog.csdn.net/qq_42697866/article/details/103381136