将字符串"0x32"转换为单个字节

4

我正在使用C#处理一个将字符串值转换为字节的问题。这似乎比我预期的要困难。基本上,我有一个名为hex的字符串,其值为"0x32",需要将字节块等于该值。

string hex = "0x32";
byte block = Convert.ToByte(hex);

上述方法无效,有人知道如何成功地将十六进制值赋给字节吗?我需要在代码后面将此字节附加到字节数组中。

2
不是答案,但在C#中数组不允许添加。你可能想尝试使用列表(List)代替。 - recursive
1
@JaredPar,“我需要在代码后面将这个字节附加到一个字节数组中。谢谢!” - James
@James,忽略那个,继续往下读。 - JaredPar
3个回答

6
请尝试以下操作:
byte block = Byte.Parse(hex.SubString(2), NumberStyles.HexNumber);
< p > 这里使用 SubString 函数是为了去除字符串前面的 "0x" 。即使指定了 NumberStyles.HexNumberParse 函数也不会接受 "0x" 前缀,如果遇到这个前缀将会出错。


这些示例只是将十六进制值转换为十进制格式,然后将十进制值分配给字节。因此,32 = 50(十进制),但问题在于我有一个需要以此格式发送的字节数组:byte[] cmd = { 0x02, 0x05, 0x01, 0x41, 0x23, 0x10, block, checksum }; 根据传入的值,block 需要等于 0x32 作为一个字节... 因此,如果选择了 50,我会将其转换为字符串 0x32,但需要将其分配给字节。它不能是 50,因为错误的命令会通过串口发送。 - user400383
@bl4kh4k:听起来你的问题不在于十六进制转换。 - dthorpe

2
Convert.ToByte(hex, 16)

这些示例只是将十六进制值转换为十进制格式,然后将十进制值分配给字节。因此,32 = 50(十进制),但问题在于我有一个需要以此格式发送的字节数组:byte[] cmd = { 0x02, 0x05, 0x01, 0x41, 0x23, 0x10, block, checksum };根据传入的值,block 需要等于 0x32 作为一个字节... 因此,如果选择了 50,则将其转换为字符串 0x32,但需要将其分配给字节。它不能是 50,因为错误的命令会通过串口发送。 - user400383
2
@bl4kh4k 一个数字就是一个数字,无论你用什么进制表示它。byteval = 0x32byteval = 50 是一样的。 - Bob

1
    string hex = "0x32";
    int value = Convert.ToInt32(hex, 16);
    byte byteVal = Convert.ToByte(value);

将会工作...

编辑

一些代码来演示0x32(十六进制)和50(整数)是相同的。

    string hex = "0x32";
    byte[] byteVal = new byte[1];
    byteVal[0] = Convert.Byte(hex, 16);
    Console.WriteLine(byteVal[0] + " - Integer value");
    Console.WriteLine(BitConverter.ToString(byteVal) + " - BitArray representation");;

这些例子只是将十六进制值转换为十进制格式,然后将十进制赋给字节。因此32 = 50在十进制下,但问题是我有一个需要以这种格式发送的字节数组:byte[] cmd = { 0x02, 0x05, 0x01, 0x41, 0x23, 0x10, block, checksum }; block需要等于0x32作为一个基于收到值的字节...所以如果选择50,我将其转换为0x32作为字符串,但需要将其分配给字节。它不能是50,因为错误的命令会通过串口发送。 - user400383
@bl4kh4k 看一下代码片段的修改。你会看到输出结果表明,50(int)和0x32(十六进制)是相同的,这取决于值如何被可视化(通过VS 2010可视化工具)。 - Dave White

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接