c#字节和位转换 - 这可以做得更好吗?

时间:2011-05-23 20:07:18

标签: c# byte

我正在构建要通过蓝牙进行通信的字节数组。这些字节部分由枚举类型构建,如下所示:

public enum Motor
{
   A = 0x00,
   B = 0x01,
   C = 0x02,
   AB = 0x03,
   AC = 0x04,
   BC = 0x05,
}

稍后在我的代码中,我创建了一个名为MyMotor的变量,类型为MyMotor.B。然后我将此变量传递给我构建字节数组的方法。

我的问题是我通过蓝牙与之通信的软件需要将枚举值的十六进制值作为字符串,即MyMotor.B =字节0x01 = dec 1 =十六进制31.但是将MyMotor直接转换为字符将会导致它评估它的枚举值,即MyMotor = B = hex 42。

出于各种原因,我无法更改我的饱和列表,所以我已经确定了一个非常黑的两行代码段:

String motorchar = Convert.ToString(Convert.ToInt32(MyMotor)); // convert to temp var
command[5] = (byte)(motorchar[0]); // store hex value of var

它按照我的意思工作,即命令[5] = hex31

我想知道是否有更好的方法。我发现的所有文章都讨论了处理整个字节数组而不是单个字节和字符。

5 个答案:

答案 0 :(得分:0)

chars[0] = (char)('0' + ((byte)myMotor & 0x0F));
chars[1] = (char)('0' + (((byte)myMotor & 0xF0) >> 4));

但是,这需要对十六进制进行一些调整。

答案 1 :(得分:0)

如果您的其他应用需要字符串,请提供一个字符串。 创建一个字符串数组来保存值(您知道)并使用枚举的int值作为该数组的索引。

答案 2 :(得分:0)

除非我遗漏了某些内容,否则你的两行代码只相当于调用;

BitConverter.ToString(MyMotor);

没有

答案 3 :(得分:0)

如果你知道你的程序的值和API期望的值总是相差一些固定的数量(例如,AC = 0x04,但API想要“4”,那么你可以写一个简单的转换:

char c = (char)((int)Motor + '0');

但是,当有超过10个值时,这会变得有点丑陋。你可以用十六进制数字来表示特殊情况,但之后它非常糟糕。

你最好创建一个查找表,最常见的是字典:

Dictionary<Motor, string> MotorLookup = new Dictionary<Motor, string>() {
    { Motor.A, "0" },
    { Motor.B, "1" },
    // etc, etc.
};

这将是最灵活,最易维护的。

答案 4 :(得分:0)

为什么不使用:

//If you want the ASCII representation.
//  e.g. myMotor == B, then the Byte Decimal value will be 49 or 0x31.
command[5] = (byte)((byte)myMotor).ToString()[0];

//If you want the numeric representation:
//  e.g. myMotor == B, then the Byte Decimal value will be 1 or 0x01.
command[5] = (byte)myMotor;

我看到你使用像“0x01”和“0x05”这样的值。 “0x”前缀表示它是十六进制数,但是你永远不会超过5,所以它与使用整数值“1”和“5”完全相同。

我看不出您在帖子中提到的十进制1 ==十六进制31或十六进制42的结果如何。 Char'1'的ASCII等价物是十进制49或十六进制31。