【分享】C# 字节帮助类 ByteHelper

独立观察员 2021 年 2 月 3 日

本文分享一个 C# 的字节(Byte)帮助类(ByteHelper),主要是一些字节、字节数组、十六进制、十六进制字符串等之间的转换操作,适用场景包括但不限于对于 M1 卡区块的读写时的数据转换等操作。

代码来源于网络,本人整理重构、仔细阅读代码并添加了较为详细的注释,一切说明见代码和注释,就不再赘述了,有不对的地方欢迎大家指出。

下面就是全部代码:

using System;
using System.Collections.Generic;
/** 源码己托管: http://gitee.com/dlgcy/dotnetcodes*/
namespace DotNet.Utilities
{/// <summary>/// 字节帮助类/// </summary>public class ByteHelper{/// <summary>/// 字节数组转为 16 进制字符串/// </summary>/// <param name="bytes"> 字节数组 </param>/// <returns>16 进制字符串 </returns>public static string ToHexString(byte[] bytes){string hexString = string.Empty;for (int i = 0; i < bytes.Length; i++){hexString += ByteToHexStr(bytes[i]);}return hexString;}/// <summary>/// 字节转为 16 进制字符串(一个字节转为两个字符:[0-F][0-F])/// </summary>/// <param name="inByte"> 字节 </param>/// <returns> 字符串 </returns>public static string ByteToHexStr(byte inByte){string result = string.Empty;try{char[] hexDict = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };char[] charParts = new char[2];charParts[0] = hexDict[(inByte >> 4) & 0x0F]; // 放在 byte 左半部分的重新移回右边并匹配十六进制字符;charParts[1] = hexDict[inByte & 0x0F];        // 放在 byte 右半部分的直接匹配十六进制字符;result = new string(charParts);}catch (Exception ex){Console.WriteLine(ex);}return result;}/// <summary>/// 十六进制字符串转为字节数组/// </summary>/// <param name="hexStr"> 十六进制字符串 </param>/// <returns> 字节数组 </returns>public static byte[] HexStrToBytes(string hexStr){/* 说明:1byte=8bit,中文 char=2byte (此处不考虑),英文 char=1byte,1 个 “个位” 的十六进制数占 4bit,所以 2 个英文 char 转为十六进制数后占一个 byte */byte[] bytes = new byte[hexStr.Length / 2 + (((hexStr.Length % 2) > 0) ? 1 : 0)];for (int i = 0; i < bytes.Length; i++){char leftPart = hexStr[i * 2];char rightPart;if ((i * 2 + 1) < hexStr.Length)rightPart = hexStr[i * 2 + 1];elserightPart = '0';int a = ByteToHexValue((byte)leftPart);int b = ByteToHexValue((byte)rightPart);// 由于 16 进制数的 ' 个位 ' 数只占 4bit,所以左部分左移 4 位,加上右部分,共占 8 位,即一个 byte;bytes[i] = (byte)((a << 4) + b);}return bytes;}/// <summary>/// 转换字节(实际为英文 char)为 16 进制数据(0-15)/// </summary>/// <param name="b"> 字节 </param>/// <returns> 字节 </returns>public static byte ByteToHexValue(byte b){byte value = 0;if (b >= '0' && b <= '9'){// 原值在 ASCII 中介于 '0'-'9' 之间的:减去 0x30,即 ASCII 中 '0' 的十六进制表示(十进制为 48),得到数值 0-9。value = (byte)(b - 0x30);}if (b >= 'A' && b <= 'F'){// 原值在 ASCII 中介于 'A'-'F' 之间的:减去 0x37,十进制为 55,‘A’的 ASCII 十进制为 65,所以可得到数值 10-15。value = (byte)(b - 0x37);}if (b >= 'a' && b <= 'f'){// 原值在 ASCII 中介于 'a'-'f' 之间的:减去 0x57,十进制为 87,‘a’的 ASCII 十进制为 97,所以可得到数值 10-15。value = (byte)(b - 0x57);}return value;}/// <summary>/// 区块字符串数据转为区块字节数据(不足则补位:16 字节)/// </summary>/// <param name="blockData"> 区块字符串数据 </param>/// <returns>List<byte></returns>public static List<byte> GetBlockBytes(string blockData){List<byte> blockBytes = new List<byte>();blockBytes.AddRange(HexStrToBytes(blockData));if (blockBytes.Count < 16){for (int i = blockBytes.Count; i < 16; i++){blockBytes.Add(0x00);}}return blockBytes;}}
}

感谢阅读。

【分享】C# 字节帮助类 ByteHelper相关推荐

  1. 11-Qt6 QByteArray字节数组类

    字节数组类QByteArray提供一个字节数组用于存储原始字节,号称 Best array!它比使用char *更方便,该类在串口通信中经常被使用,因为串口通信数据都是一个一个的8位字节流. 1.初始 ...

  2. 使用三种方式创建Class字节码类文件对象

    /*** 使用三种方式创建Class字节码类文件对象** @author silence*/ public class Demo1 {public static void main(String[] ...

  3. 计算机主板常用英语,[分享]计算机术语 主板类

    [分享]计算机术语 主板类 adimm(advanced dual in-line memory modules,高级双重内嵌式内存模块) amr(audio/modem riser:音效/调制解调器 ...

  4. 登陆cf出现1.php,cf兄弟礼包验证码 一个PHP验证码类代码分享已封装成类

    代码如下:<?php session_start(): Header("Content-type: image/gif"): class SecurityCode { pri ...

  5. 分享162个助理类简历模板,总有一款适合您

    分享1626个助理类简历模板,总有一款适合您 162个助理类简历模板下载链接:https://pan.baidu.com/s/1Uy3eXPz9D-wK-l7z3KDIWQ?pwd=l139  提取码 ...

  6. 分享111个助理类简历模板,总有一款适合您

    分享111个助理类简历模板,总有一款适合您 111个助理类简历模板下载链接:https://pan.baidu.com/s/1JafYuLPQMmq37K4V0wiqWA?pwd=8y54  提取码: ...

  7. 源码分享:C++矩阵类CLMatrixT,功能强大使用简单,支持内存池、宽指令、并行化加速!持续更新...

    CLMatrixT文档目录: C++矩阵类模板CLMatrixT介绍: 特点 新增功能 先演示使用方法: 再看运行测试结果: 最后分享源代码: C++矩阵类模板CLMatrixT介绍: 最近在研究AI ...

  8. 分享112个助理类简历模板,总有一款适合您

    分享112个助理类简历模板,总有一款适合您 112个助理类简历模板下载链接:https://pan.baidu.com/s/1EP70aMBuRt0mLNiDvk9JbA?pwd=jvzo  提取码: ...

  9. 分享113个助理类简历模板,总有一款适合您

    分享113个助理类简历模板,总有一款适合您 113个助理类简历模板下载链接:https://pan.baidu.com/s/1Md--BfvE7777L5GB_ySCjQ?pwd=s6ko  提取码: ...

最新文章

  1. VUE的组件DEMO
  2. 生成静态文件的新闻系统核心代码
  3. 8个计算机视觉深度学习中常见的Bug
  4. C语言切割多层字符串(strtok_r strtok使用方法)
  5. 写java代码时的注意事项_从方法返回Java 8的可选项时的注意事项
  6. 第一类修正贝塞尔函数的C语言实现
  7. Python-OpenCV设置摄像头分辨率
  8. Ubuntu16.04+cuda10.0+cudnn7.6配置tensorflow1.x环境
  9. 西交大计算机考博学术英语,2018年西安交通大学考博英语真题
  10. 95-874-040-源码-批处理-Flink批处理优化器值成本估算
  11. 关于把类放到结构体中
  12. 手把手教你App推广时如何能找到100个以上渠道!
  13. nw.js文件上传到服务器,用nw.js构建node项目
  14. 饥荒控制台输入没用_饥荒联机版代码怎么用 代码输入没用解决方法
  15. 华为交换IP POOL地址池使用情况查询
  16. root 启动mysql_非root用户随开机而启动mysql服务
  17. an tu tu html5 test,法语TEF基础阶段测试题和答案[下]
  18. torch.nn.Embedding的使用
  19. 闲着没事,自己做贪吃蛇耍耍?
  20. 警告关于测试人员的职场生存,千万要避开这5个坑(不看后悔)

热门文章

  1. python之_init_函数的简介
  2. Python --- 卸载
  3. VK Cup 2015 - Qualification Round 1 A. Reposts(树)
  4. 解决java.lang.NoClassDefFoundError: org/aopalliance/intercept/MethodInterceptor问题
  5. BZOJ 2588: Spoj 10628. Count on a tree 树上跑主席树
  6. WPF里面的常用笔刷
  7. 限流算法(记录cyc大佬的专栏)
  8. 《HTML5触摸界面设计与开发》——1.4 神秘谷,是什么让触摸界面反应灵敏?...
  9. 使用ABBYY FineReader进行自动图像预处理
  10. 利用Guava的Suppliers.memoize实现单例