前言

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

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

得力

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

各进制转十进制

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

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

好像有点跑题了。。。

编写类方法

工具类就叫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;
}
}
}

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

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

C# 字节数组、各进制字符串数据互转的更多相关文章

  1. C# 校验并转换 16 进制字符串到字节数组

    问题 最近在进行硬件上位机开发的时候,经常会遇到将 16 进制字符串转换为 byte[] 的情况,除了这种需求以外,还需要判定一个字符串是否是有效的 16 进制数据. 解决 字符串转 byte[] 的 ...

  2. java中把字节数组转换为16进制字符串

    把字符串数组转换为16进制字符串 import java.security.MessageDigest; public class StringUtil { public StringUtil() { ...

  3. C#//字节数组转16进制字符串

    //字节数组转16进制字符串 private static string byteToHexStr(byte[] bytes,int length) { string returnStr = &quo ...

  4. 字节数组(byte[])与16进制字符串转换

    /// <summary> /// 转换扩展类 /// </summary> public static class ConvertExtend { /// <summa ...

  5. BYTE数组与16进制字符串互转

    //字节数组转换为HEX 字符串const string Byte2HexString(const unsigned char* input, const int datasize) { ]; ; j ...

  6. C#数字、16进制字符串和字节之间互转

    转自http://luohonghong.blog.163.com/blog/static/78312058201242632055642/ 如下: .数字和字节之间互转 ; byte[] bytes ...

  7. 16进制字符串和byte数组进行相互转换\将10进制转换为任意进制

    16进制字符串和byte数组进行相互转换 简介 1个byte对应8个bit,16进制使用4个bit,所以一个byte转成16进制,占用两位. JAVA代码 private static final c ...

  8. java中 16进制字符串 与普通字符串 与 byte数组 之间的转化

    方法依赖commons-codec包  maven的引入方式如下 <dependency> <groupId>commons-codec</groupId> < ...

  9. JAVA中将byte[]数组转成16进制字符串

    方法一: /** * byte数组转化为16进制字符串 * @param bytes * @return */ public static String byteToHexString(byte[] ...

  10. 字节流、字符串、16进制字符串转换__Java(转)

    /** * @Package: * @ClassName:TypeConversion * @Description:字节流.字符串.16进制字符串转换 * @author:xk * @date:Ja ...

随机推荐

  1. 角度新奇!第一次看到这样使用MyBatis的,看得我一愣一愣的。

    你好呀,我是歪歪. 这期给大家分享一个读者给我分享的一个关于 MyBatis 的"编程小技巧",说真的,这骚操作,直接把我看得一愣一愣的. 我更情愿叫它:坑你没商量之埋雷大法. D ...

  2. 四层负载均衡的NAT模型与DR模型推导

    导读 本文首先讲述四层负载均衡技术的特点,然后通过提问的方式推导出四层负载均衡器的NAT模型和DR模型的工作原理.通过本文可以了解到四层负载均衡的技术特点.NAT模型和DR模型的工作原理.以及NAT模 ...

  3. Shiro配置类中的各个配置项浅谈

    背景: 上文中在落地实践时,对Shiro进行了相关的配置,并未对其含义作用进行详细学习,本章将进一步详解其作用含义. Shiro配置类中的各个配置项的作用: @Bean public Security ...

  4. Excel中的数值四舍五入方法详解

    在日常工作和数据处理中,我们经常需要对数值进行四舍五入操作.Excel作为一款强大的电子表格软件,提供了多种方法来实现数值的四舍五入.本文将介绍Excel中常用的四舍五入函数及其基本使用方法. ROU ...

  5. 动态规划二 & 贪心算法 实验三

    一.贪心算法和动态规划法解决背包问题. 有一个背包其容积 C = 13.现有表格内的物品可以购买. 商品 价格 P 体积 V 啤酒 24 10 汽水 2 3 饼干 9 4 面包 10 5 牛奶 9 4 ...

  6. BZ全景可视化编辑器 (KRPano可视化编辑器, 无需编写任何代码制作全景漫游)

    软件简介 BZ全景编辑器是一款KRPano全景可视化编辑工具,下载安装即可使用,无需拥有任何KRPano代码基础,便可以制作生成精美的全景漫游作品. 官方网站: 点击进入官方网站 最新版软件下载地址: ...

  7. 解决Nginx SSL 代理 Tomcat 获取 Scheme 总是 Http 问题

    背景 公司之前用的是http,但是出于苹果app审核和服务器安全性问题,要改为https,我们公司用的是沃通的ssl,按照沃通的官方文档提供的步骤完成服务器的配置. 架构上使用了 Nginx +tom ...

  8. SonarQube系列-认证&授权的配置

    参考文档:https://docs.sonarqube.org/latest/instance-administration/security/ 概述 SonarQube具有许多全局安全功能: 认证和 ...

  9. 递归解析Json,实现生成可视化Tree+快速获取JsonPath

    内部平台的一个小功能点的实现过程,分享给大家: 递归解析Json,可以实现生成可视化Tree+快速获取JsonPath. 步骤: 1.利用JsonPath读取根,获取JsonObject 2.递归层次 ...

  10. ERROR: Command errored out with exit status 1:

    Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple Collecting CairoSVG==2.4.2 Using cached ...