C# 字节数组、各进制字符串数据互转

前言

日常开发过程中,格式转换是必不可少的重要环节,经常是十进制转十六进制、十六进制转byte数组又转换回来来回转换,最然进制转换很基础同时 C# 也提供了很多直接方便进行格式转换的方法,但是封装一个工具类会方便很多,不用每次都手写代码逻辑,之前一直都是简单的自己写,稍复杂的就用前辈写好的直接调用,这次自己写一个。

简单的定义为一行代码完事,多一行都不写?。

得力

常见数制:十进制、二进制、十六进制、八进制 - 所谓进制,就是逢几进一。

image-20230429144428688

各进制转十进制

  • 以十进制的423为例:image-20230429145540523
  • 二进制的1110 = 14:image-20230429145807744
  • 十六进制 a2 (不区分大小写) = 162:image-20230429150200343
  • 十进制转二进制 52 = 110011:image-20230429150526330

当然了,写代码不用这么复杂,编程语言对常见的进制转换有已经封装好的函数方便开发者调用。

image-20230429153008442

好像有点跑题了。。。

编写类方法

工具类就叫ByteArrayConversion吧,我就按照开发程序的过程中需要用到的方法顺序写了,后面再把完整的类方法贴出来。

十六进制字符串转字节数组

/// <summary>
/// 十六进制字符串转字节数组
/// </summary>
/// <param name="data">以空格分隔的十六进制字符串</param>
/// <returns>转换后的字节数组</returns>
public static byte[] HexStringToByteArray(string data)
{
  string[] chars = data.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
  byte[] outBytes = new byte[chars.Length];
  for (int i = 0; i < chars.Length; i++)
  {
    outBytes[i] = Convert.ToByte(chars[i], 16);
  }
  return outBytes;
}

代码解读:

  1. 方法的输入是一个名为 "data" 的字符串,表示要转换的十六进制值。
  2. 使用 Split 方法将 "data" 字符串按空格字符 (' ') 分割为子字符串数组。使用 StringSplitOptions.RemoveEmptyEntries 选项可以去除由连续空格导致的空条目。
  3. 创建一个名为 "outBytes" 的字节数组,其长度与从拆分操作获得的子字符串数量相等。
  4. 方法随后通过使用 for 循环遍历 "chars" 数组中的每个子字符串。
  5. 在循环内部,使用 Convert.ToByte 方法将每个子字符串(表示一个十六进制值)转换为一个字节,使用基数 16(十六进制)作为第二个参数。得到的字节值被存储在 "outBytes" 数组的相应索引位置。
  6. 最后,返回包含转换后的字节值的 "outBytes" 字节数组。

注意:这个方法假设输入的 "data" 字符串包含有效的十六进制值,并且这些值之间用空格分隔。如果输入包含任何非十六进制字符或者字符数不为偶数,可能会导致运行时异常。

字节数组转十六进制字符串

/// <summary>
/// 字节数组转十六进制字符串
/// </summary>
/// <param name="data"></param>
/// <returns></returns>
public static string ByteArrayToHexString(byte[] data)
{
  StringBuilder hexString = new StringBuilder();
  for (int i = 0; i < data.Length; i++)
  {
    hexString.Append(data[i].ToString("X2") + " ");
  }
  return hexString.ToString().Trim();
}

代码解读:

  1. 方法的输入是一个名为 "data" 的字节数组,表示要转换为十六进制字符串的数据。
  2. 创建一个名为 "hexString" 的 StringBuilder 对象,用于存储转换后的十六进制字符串。
  3. 使用 for 循环遍历 "data" 数组中的每个字节。
  4. 在循环内部,使用 Append 方法将每个字节的十六进制表示形式追加到 "hexString" 中。ToString 方法中的参数 "X2" 表示将字节转换为两位的大写十六进制字符串,其中的 "X" 表示大写字母表示法,"2" 表示每个字节使用两位。这里也可以这样写 hexString.Append(string.Format("{0:X2} ",data[i]));
  5. 最后,使用 ToString 方法将 "hexString" 对象转换为字符串,并返回转换后的十六进制字符串。

注意:这个方法将字节数组中的每个字节转换为对应的两位十六进制字符串表示形式,并将它们连接起来形成一个完整的十六进制字符串。

十六进制字符串转十进制字符串

/// <summary>
/// 十六进制字符串转十进制字符串数组
/// </summary>
/// <param name="data">十六进制字符串</param>
/// <param name="WithSpace">各字符间是否带有空格</param>
/// <returns>转换后的十进制字符串</returns>
public static string[] HexStringToDecimal(string data, bool WithSpace)
{
  if (!WithSpace)
  {
    data = InsertFormat(data, 2, " ");
  }
  string[] dataSet = data.Split(' ');
  for (int i = 0; i < dataSet.Length; i++)
  {
    dataSet[i] = Convert.ToInt16(dataSet[i], 16).ToString();
  }
  return dataSet;
}

代码解读:

  1. 如果 WithSpace 参数为 false,则调用 InsertFormat 函数,在 data 参数中每两个字符之间插入一个空格,使得十六进制字符串中的每两个字符都能够对应一个十进制字符串。这一步是可选的,根据 WithSpace 参数的值来决定是否执行。

  2. 使用空格字符 ' ' 作为分隔符,将处理后的 data 字符串拆分为一个字符串数组 dataSet,每个元素包含一个十六进制字符串。

  3. 遍历dataSet数组,对每个元素执行以下操作:

    • 调用 Convert.ToInt16 方法将当前的十六进制字符串转换为对应的十进制整数,并将结果转换为字符串。
    • 将转换后的十进制字符串赋值给 dataSet 数组的当前元素。
  4. 返回包含转换结果的 dataSet 字符串数组。

这个方法是以" "为分隔符进行进制转换的,可以根据实际情况,自行调整插入空格的位置以应对不同规则的字符串。

InsertFormat 方法:

public static string InsertFormat(string str_Input, int interval, string value)
{
for (int i = interval; i < str_Input.Length; i += interval + 1)
{
str_Input = str_Input.Insert(i, value);
}
return str_Input;
}

完整类方法 - 持续更新ing...

/*
 * 类名称: ByteArrayConversion
 * 描述: 这是一个自定义工具类,用于数据转换问题,封装了一些常用的进制转换函数。
 * 作者: Boiled Yakult
 * 创建日期: 2023年4月14日09:18:19
 */

using System;
using System.Text;

namespace TWMC_Check.CodingHelper
{
    class ByteArrayConversion
    {
        public static string InsertFormat(string str_Input, int interval, string value)
        {
            for (int i = interval; i < str_Input.Length; i += interval + 1)
            {
                str_Input = str_Input.Insert(i, value);
            }
            return str_Input;
        }

        /// <summary>
        /// 十六进制字符串转字节数组
        /// </summary>
        /// <param name="data">以空格分隔的十六进制字符串</param>
        /// <returns>转换后的字节数组</returns>
        public static byte[] HexStringToByteArray(string data)
        {
            string[] chars = data.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
            byte[] outBytes = new byte[chars.Length];
            for (int i = 0; i < chars.Length; i++)
            {
                outBytes[i] = Convert.ToByte(chars[i], 16);
            }
            return outBytes;
        }

        /// <summary>
        /// 字节数组转十六进制字符串
        /// </summary>
        /// <param name="data"></param>
        /// <returns>转换后的十六进制字符串</returns>
        public static string ByteArrayToHexString(byte[] data)
        {
            StringBuilder hexString = new StringBuilder();
            for (int i = 0; i < data.Length; i++)
            {
                hexString.Append(data[i].ToString("X2") + " ");
            }
            return hexString.ToString().Trim();
        }

        /// <summary>
        /// 十六进制字符串转十进制字符串数组
        /// </summary>
        /// <param name="data">十六进制字符串</param>
        /// <param name="WithSpace">各字符间是否带有空格</param>
        /// <returns>转换后的十进制字符串</returns>
        public static string[] HexStringToDecimal(string data, bool WithSpace)
        {
            if (!WithSpace)
            {
                data = InsertFormat(data, 2, " ");
            }
            string[] dataSet = data.Split(' ');
            for (int i = 0; i < dataSet.Length; i++)
            {
                dataSet[i] = Convert.ToInt16(dataSet[i], 16).ToString();
            }
            return dataSet;
        }

        public static string[] HexStringToDecimal_Value(string data, bool WithSpace)
        {
            if (!WithSpace)
            {
                data = InsertFormat(data, 8, " ");
            }
            string[] dataSet = data.Split(' ');
            for (int i = 0; i < dataSet.Length; i++)
            {
                dataSet[i] = Convert.ToInt16(dataSet[i], 16).ToString();
            }
            return dataSet;
        }
    }
}

有用话记得帮忙点点赞❤️,爱你。

有问题的话可以评论留言哈。

原文链接:https://www.cnblogs.com/BoiledYakult/p/17358262.html

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C# 字节数组、各进制字符串数据互转 - Python技术站

(0)
上一篇 2023年5月5日
下一篇 2023年5月5日

相关文章

  • C#.NET发送邮件的实例代码

    以下是关于C#.NET发送邮件的实例代码的完整攻略: 基础知识 在进行C#.NET发送邮件之前,需要了解以下几个基础概念: SMTP服务器 SMTP服务器指的是用于发送邮件的服务器。在进行C#.NET发送邮件时,需要设置邮件发送所使用的SMTP服务器,以便将邮件成功发送至对方邮箱。 邮件协议 邮件协议是指用于发送和接收邮件的协议。常见的邮件协议有POP3、I…

    C# 2023年5月31日
    00
  • .NET下模拟数组越界的方法详解

    下面我来详细讲一下“.NET下模拟数组越界的方法详解”的攻略。 标题 首先,我们需要明确一下,什么是数组越界。当我们在使用数组时,访问了不存在的数组下标,就会发生数组越界,而这个错误往往会导致程序崩溃或异常。 在.NET中,我们可以通过模拟数组越界的方法来测试代码的鲁棒性和容错性。下面是模拟数组越界的具体步骤: 步骤1:创建一个数组 首先,我们需要创建一个数…

    C# 2023年5月31日
    00
  • C# 文件上传 默认最大为4M的解决方法

    标题 C# 文件上传 默认最大为4M的解决方法 问题描述 C# 文件上传默认最大为4M,这个大小对于一些需要上传比较大文件的网站来说,就显得非常不够用了。那么该怎么办呢? 解决方法 可以通过修改Web.config文件中的httpRuntime节点中的maxRequestLength属性,来改变文件上传的最大大小限制。该属性的单位是KB,因此需要将想要设定的…

    C# 2023年6月3日
    00
  • 轻松学习C#的抽象类

    为了轻松学习C#的抽象类,您可以遵循以下步骤进行学习。 1.了解抽象类的定义和用途 抽象类是一个被声明为抽象的类,它不能被实例化,但是可以使用它的引用来引用其子类的对象。抽象类通常用于定义抽象方法,这些方法不包括任何实现细节,只是定义了子类必须实现的方法。抽象类还可以包括实现的方法和字段。 2.学习如何声明抽象类 要声明一个抽象类,您需要使用abstract…

    C# 2023年6月1日
    00
  • c# 成员类型访问权限低于字段本身的实现

    “C# 成员类型访问权限低于字段本身的”实现”指的是,当定义了一个类的私有字段时,如果你使用更低访问级别的成员类型如Property或Method来访问该字段,则可以在该类之外访问到该字段。这种实现方式可以使我们更加灵活地使用类的成员,并增加代码的可读性和可维护性。 下面是具体的实现攻略: 定义私有字段 首先,在类中定义一个私有字段,使用 private 访…

    C# 2023年6月6日
    00
  • C# 计算标准偏差相当于Excel中的STDEV函数实例

    计算标准偏差(Standard Deviation)是统计学中的一个重要概念,它是一组数据的离散程度的度量标准。在统计分析中,标准偏差用来衡量数据集中数据的分散情况。在C#中,可以使用Math库中的方法进行计算。下面是计算标准偏差相当于Excel中STDEV函数实例的完整攻略。 步骤一:定义数据 首先,我们需要定义一组数据作为计算标准偏差的数据源。假设我们有…

    C# 2023年6月8日
    00
  • asp.net小谈网站性能优化

    ASP.NET小谈网站性能优化攻略 1. 确认问题 在进行优化之前,我们需要确认当前网站存在的性能问题,可以通过下列几种方式来确定: 使用各种性能分析工具和监控工具,识别哪些请求是最缓慢的,以及可能是瓶颈的地方 观察Web服务器、数据库服务器的监控信息和性能数据,确认是否存在资源瓶颈(如 CPU、内存、I/O、网络带宽等) 观察 Web 应用程序日志,看是否…

    C# 2023年5月31日
    00
  • UnityShader使用图像叠加实现运动模糊

    下面是详细讲解”Unity Shader使用图像叠加实现运动模糊”的攻略。 一、前言 在实现游戏视觉效果时,运动模糊是一种非常实用的手段。运动模糊使用了相邻的帧并取平均值以模拟运动物体的模糊效果,使动作看起来更加连续、自然。 二、实现思路 运动模糊的实现思路是将相邻的帧的图像进行叠加处理,最后再进行取平均。具体实现时,需要使用相机的 RenderTextur…

    C# 2023年6月3日
    00
合作推广
合作推广
分享本页
返回顶部