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

问题

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

解决

字符串转 byte[] 的情况可以使用 Convert.ToByte(string) 来解决,16 进制数据的判定则可以结合正则和长度来进行处理。

在这里我是只接受以下两种形式的 16 进制字符串,并对其进行验证和转换。

AA 12 34 56 78 06
AA-12-34-56-78-06

下面就是代码:

public static byte[] HexStringToBytes(string hexStr)
{
    // 处理干扰,例如空格和 '-' 符号。
    var str = hexStr.Replace("-",string.Empty).Replace(" ", string.Empty);

    if (validStr.Length % 2 != 0) throw new ArgumentException("传入的 16 进制字符串长度不对。");
    if (!new Regex(@"[A-Fa-f0-9]+$").IsMatch(hexStr)) throw new ArgumentException("传入的 16 进制字符串数据不符合规范。");

    // 构建一个字符串长度的序列,每隔 2 个字符长度,即使用 Convert 构成一个字节。
    return Enumerable.Range(0, str.Length)
        .Where(x => x % 2 == 0)
        .Select(x => Convert.ToByte(str.Substring(x, 2), 16))
        .ToArray();
}

参考:StackOverFlow

后记

最近在忙自己的事情,vNext 系列的文章可能会在 10 号之后才能更新了。

原文地址:https://www.cnblogs.com/myzony/p/10810449.html

时间: 2024-10-07 17:41:39

C# 校验并转换 16 进制字符串到字节数组的相关文章

C# byte[] 转换16进制字符串

1.byte[] 转换16进制字符串 1.1 BitConverter方式 1 var str = DateTime.Now.ToString(); 2 var encode = Encoding.UTF8; 3 var bytes = encode.GetBytes(str); 4 var hex = BitConverter.ToString(bytes, 0).Replace("-", string.Empty).ToLower(); 5 Console.WriteLine(he

lua 转换16进制字符串为10进制数值

> print(tonumber("03FFACB", 16)) 4192971 利用tonumber函数,"16"表示"03FFACB"为16进制数.

Java中byte与16进制字符串的互相转换

Java中byte用二进制表示占用8位,而我们知道16进制的每个字符需要用4位二进制位来表示(23 + 22 + 21 + 20 = 15),所以我们就可以把每个byte转换成两个相应的16进制字符,即把byte的高4位和低4位分别转换成相应的16进制字符H和L,并组合起来得到byte转换到16进制字符串的结果new String(H) + new String(L).即byte用十六进制表示只占2位. 同理,相反的转换也是将两个16进制字符转换成一个byte,原理同上. 根据以上原理,我们就可

iOS 将16进制字符串转换成UIColor

#pragma mark - 将16进制字符串转换成 UIColor - (UIColor *)generateColorObjectWithHex:(NSString *)hexString { unsigned int red = 0, green = 0, blue = 0; NSRange range = {0, 2}; range.location = 0; NSString *redString = [hexString substringWithRange:range]; NSSc

将16进制字符串转换成16进制数据

var tb1 = Tb1.Text; if (string.IsNullOrEmpty(tb1)) { tb1 = "0000"; } var s1 = tb1.Substring(0, 2); var int_1 = Convert.ToInt32(s1, 16); var s2 = tb1.Substring(2, 2); var int_2 = Convert.ToInt32(s2, 16); var bt1 = Convert.ToByte(int_1); var bt2 =

iOS 16进制字符串转换成int十进制

NSRange rangeErr; rangeErr.location = 6; rangeErr.length = 2; NSString *strings = [value substringWithRange:rangeErr]; int errCode = (int)strtoul([strings UTF8String],0,16);  //16进制字符串转换成int NSString *ascStr = [NSString stringWithFormat:@"%c",re

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

Java代码   /** * @Package: * @ClassName:TypeConversion * @Description:字节流.字符串.16进制字符串转换 * @author:xk * @date:Jan 8, 2013 5:00:08 PM */ public class TypeConversion { /** * @Title:bytes2HexString * @Description:字节数组转16进制字符串 * @param b *            字节数组 *

Java中byte与16进制字符串的互相转换(转)

Java中byte用二进制表示占用8位,而我们知道16进制的每个字符需要用4位二进制位来表示(23 + 22 + 21 + 20 = 15),所以我们就可以把每个byte转换成两个相应的16进制字符,即把byte的高4位和低4位分别转换成相应的16进制字符H和L,并组合起来得到byte转换到16进制字符串的结果new String(H) + new String(L).即byte用十六进制表示只占2位. 同理,相反的转换也是将两个16进制字符转换成一个byte,原理同上. 根据以上原理,我们就可

C#字符串和16进制字符串之间的转换

将字符串编码成 16进制 字符串表示: using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Net; namespace ConsoleApplication1{ class Program { static void Main(string[] args) { // 将字符串转换成16进制表示: // 先将字符串转换成 byte 数组: // (1).如果是