gpt4 book ai didi

c# - 如何设置数据报文中不同段的十六进制输入范围?

转载 作者:太空狗 更新时间:2023-10-30 01:32:23 26 4
gpt4 key购买 nike

一个 24 个十六进制字节的消息条目:xx xx xx xx xx xx xx xx xx xx xx xx

我有一个 24 十六进制字节的消息条目进入一个具有不同字节段条目要求的文本框,是否有一个模板代码可以让我动态编码每个段所需的十六进制值范围,例如1、4?

我尝试了下面的代码,但不是我想要的,因为它将整个十六进制条目转换为 int 等价物,而没有让我自由地编码我想要的范围。

outputTxt.Text = String.Join(" ", 
hexTextBox.Text.Trim().Split(' ').Select(item => Convert.ToInt32(item, 16)));

例如,输入文本框的第一组 2 个十六进制值,一个函数检查输入的十六进制值在 uint 中是否在 0 到 100 之间,然后将其转换为对应的十进制值到输出文本框,否则将显示 'Error ' 显示在输出文本框上。

接下来的 4 个字节,我只允许 4 个字节的十六进制条目在 int 中介于 -1000 到 1000 之间,否则显示“错误”消息。

编辑:对于我之前如何表达我的句子的混淆感到抱歉,因为 5 个字节只是每个字节的 ASCII 字符的字节表示,范围为 0 到 255。如何编码这些不同的情况?谢谢!

uint value1 = reader.ReadByte(); // 1 byte.
if (value1 ==700)
{
OutputTxt.Text = value1.ToString();
OutputTxt.Text +="\n";
}
else
{
OutputTxt.Text = "Error"
OutputTxt.Text +="\n";
}

uint value2 = reader.ReadByte(); // 1 byte.
if (value2 <=1000)
{
OutputTxt.Text += value2.ToString();
OutputTxt.Text +="\n";
}
else
{
OutputTxt.Text += "Error"
OutputTxt.Text += "\n";
}

我知道这可能是一个简单的错误,但我无法找出正确的语法来防止在运行第二次 readByte() 验证后重新更新我的第一个字节文本框?

最佳答案

我认为你最好的选择是做这样的事情:

  1. 将十六进制字符串转换为字节数组。
  2. 使用 MemoryStream 包装数组并将其传递给 BinaryReader 以便更轻松地读取数据。
  3. 编写一个自定义方法,从流中读取所需的值并验证读取的值。

唯一棘手的一点是解析一组不是整数类型正常大小的字节,例如 5 个字节。

这种情况的解决方案是在 5 个字节前加上 3 个零字节,然后使用 BitConverter 将其转换为 long。例如:

public static long LongFromBytes(byte[] bytes)
{
// This uses little-endian format. If you're expecting bigendian, you
// would need to reverse the order of the bytes before doing this.

return BitConverter.ToInt64(bytes.Concat(new byte[8-bytes.Length]).ToArray(), 0);
}

将十六进制字符串(带空格)转换为字节数组的合适方法是:

public static byte[] StringToByteArray(string hex)
{
hex = hex.Trim().Replace(" ", "");

return Enumerable.Range(0, hex.Length)
.Where(x => x % 2 == 0)
.Select(x => Convert.ToByte(hex.Substring(x, 2), 16))
.ToArray();
}

现在您可以将这些东西放在一起来验证十六进制字符串中的值:

string hexString = "00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 11 12 13 14 15 16 17 18";

using (var stream = new MemoryStream(StringToByteArray(hexString)))
using (var reader = new BinaryReader(stream))
{
int value1 = reader.ReadByte(); // 1 byte.
Console.WriteLine(value1);

int value2 = reader.ReadByte(); // 1 byte.
Console.WriteLine(value2);

int value3 = reader.ReadInt32(); // 4 bytes.
Console.WriteLine(value3);

long value4 = LongFromBytes(reader.ReadBytes(5)); // 5 bytes into a long.
Console.WriteLine(value4);
}

阅读这些值后,您可以根据需要验证它们。

关于c# - 如何设置数据报文中不同段的十六进制输入范围?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37382165/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com