2013-06-21 3 views
2

Предположим, что у меня есть строка, содержащая шестнадцатеричное значение. Например:Как преобразовать шестнадцатеричную строку в строку, значения ASCII которой имеют одинаковое значение в C#?

string command "0xABCD1234"; 

Как я могу преобразовать эту строку в другую строку (например, string codedString = ...) таким образом, что ASCII-кодированное представление этого новая строка имеет один и тот же двоичный код как оригинальные строки содержания?

Причина, по которой мне нужно это сделать, состоит в том, что у меня есть библиотека от производителя оборудования, которая может передавать данные с их части оборудования другому аппарату поверх SPI. Их функции принимают строки как входные данные, но когда я пытаюсь отправить «AA», я ожидаю, что SPI передаст двоичный код 10101010, но вместо этого он передает представление ascii AA, которое равно 0110000101100001.

Кроме того, эта шестнадцатеричная строка будет длиннее 32 шестнадцатеричных символов (то есть 256 бит).

ответ

5
string command = "AA"; 
int num = int.Parse(command,NumberStyles.HexNumber); 
string bits = Convert.ToString(num,2); // <-- 10101010 
+1

Это показывает, как оправдывается знание структуры. Я люблю это. – Nathan

+0

Мне понадобится 'bits', чтобы не содержать строку« 10101010 », но любая строка была бы представлена ​​двоичным 10101010! – w1res

+0

@ w1res, то это 'num'. он содержит эти биты. (если вы хотите отправить 1 байт, чем использовать 'byte.Parse'). Кстати: бит => строка не всегда возможна. каждая строка имеет представление байтового (битового) массива, но каждый массив байтов не обязательно имеет правильное строковое представление. – I4V

-1

Это определенно выполнимо, хотя я не знаю ни одного метода .NET, чтобы сделать это напрямую. Я думаю, вы захотите сначала преобразовать шестую строку в массив байтов - первый ответ this question показывает, как - тогда вы можете просто сделать System.Text.Encoding.ASCII.GetString(bytes);, чтобы получить из нее строку.

+0

Не самый лучший ответ, но рабочий раствор, почему downvote? – evanmcdonnal

+0

Нет, это не «рабочее решение» –

-1

Я думаю, я понимаю, что вам нужно ... вот главная часть кода .. asciiStringWithTheRightBytes является то, что вы бы отправить вашу команду.

var command = "ABCD1234"; 
var byteCommand = GetBytesFromHexString(command); 
var asciiStringWithTheRightBytes = Encoding.ASCII.GetString(byteCommand); 

И Подпрограммы он использует здесь ...

static byte[] GetBytesFromHexString(string str) 
{ 
    byte[] bytes = new byte[str.Length * sizeof(byte)]; 
    for (var i = 0; i < str.Length; i++) 
     bytes[i] = HexToInt(str[i]); 
     return bytes; 
} 

static byte HexToInt(char hexChar) 
{ 
    hexChar = char.ToUpper(hexChar); // may not be necessary 

    return (byte)((int)hexChar < (int)'A' ? 
     ((int)hexChar - (int)'0') : 
     10 + ((int)hexChar - (int)'A')); 
} 
+0

Кевин, вы знаете, что есть встроенный класс, который делает то же самое (SoapHexBinary)? Просто найдите stackoverflow. – I4V

+0

@ I4V Я бы не стал писать код, если бы знал. :) Спасибо за совет. Когда я делал поиск, я не нашел SoapHexBinary. – Kevin

+0

http://stackoverflow.com/questions/13166443/how-to-delete-every-2nd-character-in-a-string http://stackoverflow.com/questions/12942904/calculate-twos-complement-checksum- из-шестнадцатеричной строки – I4V

Смежные вопросы