2016-12-30 4 views
1

Я пытаюсь читать с акселерометра над BLE с моего устройства Arduino. Единственная проблема заключается в том, что я не уверен, как преобразовать ее обратно в читаемое строковое значение.Как преобразовать значение шестнадцатеричного значения в строку ASCII?

Мой 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? <

Почему это происходит и как я могу преобразовать это обратно в читаемую строку на C#?

Update 1

Я сделал некоторые исследования в исходном боба 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 
    */ 

Update 2

Наконец получили его работы по реализации протокола упомянутый в обновлении 1. Фактическая полезная нагрузка находится внутри, поэтому ее необходимо извлечь из шестнадцатеричной строки.

+1

значение A0-08-00-00-00 находятся за пределами нормального диапазона печати, чтобы дать вам неудивительные символы. – BugFinder

ответ

2

Ничего более 0x7F NOT ASCII. Первый символ равен 0xA0. Что, как в Unicode, так и в IOS LATIN 1, является NBSP. Последовательность A0-08-00-00-00, вероятно, имеет смысл, но не в виде обычного текста. Вы должны взглянуть на характеристики вашего акселерометра и посмотреть, что он извергает, чтобы правильно интерпретировать его.

EDIT

Кроме того, поскольку в вашем коде вы установите переменную STATUS в «ПЕРЕМЕЩЕНИЕ», это может быть, что символы до и после перемещения являются паразитные символов.

+0

В этом анализе Unicode означает набор символов, и вы используете кодировку UTF-8 ('Encoding.UTF8') для Unicode (в отличие от кодировки UTF-16 для Unicode« Encoding.Unicode ») , –

+0

Хорошо, это доска, которую я использую: https://punchthrough.com/bean/docs/guides/features/accelerometer/ –

+0

Я посмотрю документы, чтобы узнать, могу ли я узнать –

-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(); 
} 

Ссылки: преобразованный из функции Java в Convert Hex to ASCII and ASCII to Hex

+0

Этот код использует набор символов ISO 8589-1 и его одно кодирование в византийском ключе. Первые 256 кодовых точек Unicode такие же, как и весь набор символов ISO 8589-1. 'char' - это код UTF-16. UTF-16 является кодировкой набора символов Unicode. UTF-16 выполняет кодирование первых 256 кодовых точек Unicode с использованием одного 16-разрядного блока кода с высоким байтом 0. Таким образом, преобразование двух шестнадцатеричных цифровых символов в целое число, а затем литье в 'char' эффективно декодирует данные как ISO 8589 -1 текст. –