繁体   English   中英

在 c# 中将字符串转换为等效字节十六进制

[英]Converting string to equivalent byte hex in c#

I have an incoming string 68016101061B4A60193390662046804020422044204000420040402060226024676DB16 and I want to convert into 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 but in字节。 我想将这些字节写入串行端口。

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 };

它给了我下面的数组

在此处输入图像描述

我怎样才能转换它?

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

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>

小提琴

如果你想使用纯 LINQ,你可以做一些类似的事情

data
    .Select((x,i) => (Index: i, Value: x))
    .GroupBy(tuple => tuple.Index / 2, tuple => tuple.Value, (_,values) => "0x" + string.Join("",values))
    .Select(x => Convert.ToByte(x, 16))
    .ToArray();

如果你想要一个荒谬的单线。

在 Linq 中:

string src = "040204220442040004200404020602260246";
string res = Enumerable.Range(0, src.Length)
                       .Where(i => i % 2 == 0)
                       .Aggregate<int, string, string>("", (s, i) => s + " 0x" + src.Substring(i, 2), (s) => s.Trim());

或 - 如果输入字符串很长 - 以提高性能:

 string res = Enumerable.Range(0, src.Length)
                        .Where(i => i % 2 == 0)
                        .Aggregate<int, StringBuilder, string>(new StringBuilder(), (sb, i) => sb.Append(" 0x").Append(src.Substring(i, 2)), (sb) => sb.ToString().Trim());

在这两种情况下, res都包含"0x04 0x02 0x04 0x22 0x04 0x42 0x04 0x00 0x04 0x20 0x04 0x04 0x02 0x06 0x02 0x26 0x02 0x46"

如果您希望将结果作为字节数组并处理具有奇数位数的输入字符串,则可以按以下方式完成:

string src = "040204220442040004200404020602260246";
if (src.Length % 2 == 1) src += "0";
byte[] res = Enumerable.Range(0, src.Length)
                       .Where(i => i % 2 == 0)
                       .Select(i => Byte.Parse(src.Substring(i, 2), System.Globalization.NumberStyles.AllowHexSpecifier))
                       .ToArray();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM