如何将十六进制值转换回ASCII字符串?

时间:2016-12-30 10:47:18

标签: c# arduino hex bluetooth-lowenergy

我试图从我的Arduino设备上通过BLE读取加速度计。唯一的问题是我不确定如何将其转换回可读的字符串值。

我的Arduino草图(部分内容)如下所示:

if((x - lastX) > threshold) {
  STATUS = "MOVING";
  toggleIsMoving();
} else if((y - lastY) > threshold) {
  STATUS = "MOVING";
  toggleIsMoving();
} else if((z - lastZ) > threshold) {
  STATUS = "MOVING";
  toggleIsMoving();
} else {
  STATUS = "STOPPED";
  toggleIsStopped();
}
lastX = x;
lastY = y;
lastZ = z;
Serial.print(STATUS);

我在Xamarin Android应用程序(通过BLE)中收到的十六进制值是:

A0-08-00-00-00-4D-4F-56-49-4E-47-CE-3C

我目前的实施是:

public static string FromHex(string hex) {
  hex = hex.Replace("-", "");
  byte[] raw = new byte[hex.Length / 2];
  for (int i = 0; i < raw.Length; i++)
    raw[i] = Convert.ToByte(hex.Substring(i * 2, 2), 16);
  return Encoding.ASCII.GetString(raw);
}

结果是:

MOVING&LT;

为什么会发生这种情况,如何将其转换回C#中的可读字符串?

更新1

我在bean-sdk源代码中做了一些研究,发现了这个:

/**
   * Represents a LightBlue Serial Transport Message
   *
   * Defined as:
   *
   *    [1 byte]         - Length     (Message ID + Payload)
   *    [1 byte]         - Reserved
   *    [2 byte]      BE - Message ID
   *    [0-64 bytes]  LE - Payload
   *    [2 bytes]     LE - CRC        (Everything before CRC)
   *
   * @param messageId
   * @param definition
   */

更新2

最后通过实现更新1中提到的协议使其工作。实际有效负载位于内部,因此需要从十六进制字符串中提取。

2 个答案:

答案 0 :(得分:2)

超过0x7F的任何内容都是 NOT ASCII。第一个字符是0xA0。其中,Unicode和IOS LATIN 1都是NBSP。序列A0-08-00-00-00可能有意义,但不是以纯文本方式。您应该查看加速度计的规格,看看它喷出的是什么来正确解释它。

修改

此外,由于在您的代码中将变量STATUS设置为&#34; MOVING&#34;,MOVING之前和之后的字符可能是虚假字符。

答案 1 :(得分:-1)

我使用了以下内容:

private static string hexToASCII(string hexValue)
{
    StringBuilder output = new StringBuilder("");
    for (int i = 0; i < hexValue.Length; i += 2)
    {
        string str = hexValue.Substring(i, 2);
        output.Append((char)Convert.ToInt32(str, 16));
    }
    return output.ToString();
}

参考:从Convert Hex to ASCII and ASCII to Hex

的Java函数转换而来