【发布时间】:2018-12-12 11:59:53
【问题描述】:
我必须将以0x 开头的十六进制字符串或以BitConverter 转换的十六进制字符串转换为byte 数组。为此,我使用这个功能非常好:
public static byte[] ConvertToByteArray(this string s)
{
if (s.StartsWith("0x"))
{
var ret = new byte[(s.Length - 2) / 2];
for (int i = 2; i < s.Length; i += 2)
{
ret[(i - 2) / 2] = Convert.ToByte(string.Concat(s[i], s[i + 1]), 16);
}
return ret;
}
else
return s.Split('-').Select(b => Convert.ToByte(b, 16)).ToArray();
}
示例输入,来自某种网络设备(将其视为使用 wireshark 记录的消息):
byte[] data1 = "0x020206000000022800A601585E40".ConvertToByteArray();
byte[] data2 = "02-02-06-00-00-00-02-28-00-A6-01-58-5E-40".ConvertToByteArray();
CollectionAssert.AreEqual(data1, data2);
现在我想了解如何在 LINQ 中编写第一种可能性(以 0x 开头)来摆脱这个 1990 年的 for 循环。
有没有办法同时选择两个字符,或者有比我的更优雅的方法吗?
【问题讨论】:
-
你能分享函数 ConvertToByteArray 的输入吗?
-
尝试以下操作:字符串输入 = "0x0123456789ABCDEF"; ushort[] output = input.Skip(2).Select((x, i) => new { x = x, i = i }).GroupBy(x => xi / 2).Select(x => (ushort )((x.FirstOrDefault().x
-
或者如果您需要将字符解析为十六进制: string input = "0x0123456789ABCDEF"; ushort[] output = input.Skip(2).Select((x, i) => new { x = byte.Parse(x.ToString(), System.Globalization.NumberStyles.HexNumber), i = i })。 GroupBy(x => xi / 2).Select(x => (ushort)((x.FirstOrDefault().x
-
@jdweng 这对我不起作用,因为我需要一个字节数组。数据形成网络资源
-
我只是按照您从字符串到 ushort 的代码进行操作。不知道为什么你的代码有两个步骤去 ushort 然后去 byte[]。我以为你需要 ed ushort。