C#学习笔记之字节数组转换为16进制数字格式字符串?C#16进制字符串怎样转化为等效的字节数组

一、字节数组转换为等效的16进制字符串

在串口通信中遇到的一个比较常见的问题就是需要把字节流转换为字符串的问题,不管是需要将接受到的数据打印到log还是需要将字符串显示到Demo上,遇到这种问题还要自己写一个转换函数太过于麻烦,那么标准库中是否有相关函数可以直接转化呢?

1、Convert.ToString(byte value, IFormatProvider provider)
        // 摘要:
        //     使用指定的区域性特定格式设置信息,将指定的 8 位无符号整数的值转换为其等效的字符串表示形式。
        // 参数:
        //   value:
        //     要转换的 8 位无符号整数。
        //   provider:
        //     一个提供区域性特定的格式设置信息的对象。
        // 返回结果:
        //     value 的字符串表示形式。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            byte[] a = { 0x1A, 0x2B, 0x3c, 0x4d, 0x5f };
            string str = "";
            foreach (byte aa in a)
            {
                str += Convert.ToString(aa,16);
            }
            Console.WriteLine(str);
            Console.ReadLine();
        }
    }
}

 运行结果如下:

该函数缺点是不支持自定义格式的修改,比如转换为大写形式、补0之类的功能。 

2、ToString(string format)

        // 摘要:
        //     使用指定的格式将当前 System.Byte 对象的值转换为它的等效字符串表示形式。
        // 参数:
        //   format:
        //     一个数值格式字符串。
        // 返回结果:
        //     按照 System.Byte 参数指定的方式进行格式设置的当前 format 对象的字符串表示形式。
        // 异常:
        //   T:System.FormatException:
        //     format 包含不受支持的说明符。 “备注”部分中列出了受支持的格式说明符。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            byte[] a = { 0x0A, 0x1B, 0x2C, 0x3d, 0x4e, 0x5f };
            string str = "";
            foreach (byte aa in a)
            {
                str += aa.ToString("x2");
            }
            Console.WriteLine(str);
            str = "";
            foreach (byte aa in a)
            {
                str += aa.ToString("X2");
            }
            Console.WriteLine(str);
            Console.ReadLine();
        }
    }
}

运行结果如下:

这种方法转换较第一种功能多了很多,只要设置相应的转换格式,即可得到自己希望得到的样子。

关于更多ToString() 函数参数的格式,请参阅C# byte转为16进制字符串~~~ToString()格式

这种方法不可避免的还是需要借助一个循环来把字节数组中的字节一个一个转化为16进制数字,那么有没有方法能直接一行就完成这个转化呢?

接下来就是重点要介绍的

3、public static string ToString(byte[] value);
        // 摘要:
        //     将指定的字节数组的每个元素的数值转换为其等效的十六进制字符串表示形式。
        // 参数:
        //   value:
        //     字节数组。
        // 返回结果:
        //     十六进制对字符串连字符分隔的其中的每个对表示中的相应元素value; 例如,"7F-2c-4A-00"。
        // 异常:
        //   T:System.ArgumentNullException:
        //     value 为 null。
 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            byte[] a = { 0x0A, 0x1B, 0x2C, 0x3d, 0x4e, 0x5f };
            string str = BitConverter.ToString(a);
            Console.WriteLine(str);
            Console.ReadLine();
        }
    }
}

运行结果如下:

这样,就实现了只需要一行即可将字节数组转化为16进制数字格式的字符串了。此函数还有其他重载函数,支持指定位置、指定长度进行转化。

当然,缺点就是也不支持自定义的格式,只能忍受每个字节中间都有一个“-”了。

二、16进制字符串怎样转化为等效的字节数组

据作者所知,应该是没有办法直接将16进制字符串转化为等效的字节数组的,所以我们只能一个字节一个字节的转化

可以使用byte.Parse()方法,例如:byte.Parse("3f")或byte.Parse("3f", NumberStyles.HexNumber)

byte[] HexStrToArray(string HexStr)
{
    List<byte> HexArray = new List<byte>();
    for (int i = 0; i < HexStr.Length; i += 2)
    {
        try
        {
            HexArray.Add(byte.Parse(HexStr.Substring(i, 2)));
        }
        catch
        {
            //不要相信传进来的字符串一定是标准的
            return HexArray.ToArray();
        }
    }
    return HexArray.ToArray();
}

 

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
C#中,可以使用BitConverter类来将十六进制字符串转换字节数组。首先,我们需要将十六进制字符串转换字节数组,然后再将字节数组转换为十六进制字符串表示。下面是一个示例代码: ```csharp string hexString = "3132333435363738393a3b3c3d3e3f40"; byte[] byteArray = new byte = Convert.ToByte(hexString.Substring(i, 2), 16); } string result = BitConverter.ToString(byteArray).Replace("-", ""); Console.WriteLine(result); ``` 在上面的代码中,我们首先定义了一个十六进制字符串hexString。然后,我们创建了一个与十六进制字符串长度一半大小的字节数组byteArray。接下来,使用一个循环将每两个字符转换为一个字节,并将其存储到字节数组中。最后,使用BitConverter.ToString方法将字节数组转换为十六进制字符串表示,并使用Replace方法去除其中的分隔符“-”。最终,将转换后的结果打印出来。 注意,上述代码中的hexString长度必须为偶数,否则会引发异常。另外,如果需要将转换后的字节数组以其他形式使用,可以根据具体需求进行进一步操作。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [16进制字符串字节字节数组](https://blog.csdn.net/weixin_28289089/article/details/117018463)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jumul

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值