首页 > 解决方案 > 在c#中将字符串转换为等效的字节十六进制

问题描述

我有一个传入的字符串68016101061B4A60193390662046804020422044204000420040402060226024676DB16,我想转换为0x68 0x01 0x61 0x01 0x06 0x1B 0x4A 0x60 0x0B 0x86 0xE8 0x46 0x04 0x68 0x04 0x02 0x04 0x22 0x04 0x42 0x04 0x00 0x04 0x20 0x04 0x40 0x02 0x06 0x02, 0x26 0x02 0x46 0x76 0xDB 0x16但以字节为单位。我想将这些字节写入串行端口。

port.Write(bytes, 0, bytes.Length);

更新 1

下面是我通过硬编码发送的字节数组

var dataItems = new byte[] { 0x68, 0x01, 0x61, 0x01, 0x06, 0x1B, 0x4A, 0x60, 0x0B, 0x86, 0xE8, 0x46, 0x04, 0x68, 0x04, 0x02,
            0x04, 0x22, 0x04, 0x42, 0x04, 0x00, 0x04, 0x20, 0x04, 0x40, 0x02, 0x06, 0x02, 0x26, 0x02, 0x46 ,0x76 ,0xDB ,0x16 };

它给了我下面的数组

在此处输入图像描述

我怎样才能转换它?

标签: c#.netstringhex

解决方案


您可以使用正则表达式来执行此操作:

var regex = new Regex(@"(\d{2})");

string aString = "040204220442040004200404020602260246";
string replaced = regex.Replace(aString, "x$1 ");

小提琴

编辑似乎您需要字节而不是字符串,您可以使用此处建议的基于 Linq 的答案之一或一个简单的循环:

if ((aString.Length % 2) != 0)
{
    // Handle invalid input
}

var bytes = new byte[aString.Length / 2];

int index = 0;
for (int i = 0; i < aString.Length; i += 2)
{
    string digits = aString.Substring(i, 2);
    byte aByte = (byte)int.Parse(digits, NumberStyles.HexNumber);

    bytes[index++] = aByte;
}

port.Write(bytes, 0, bytes.Length);

请注意,如果 GC 压力成为问题,您可以使用ReadOnlySpan<char>.

小提琴


推荐阅读