Использование int в качестве числового представления строки в C # - PullRequest
2 голосов
/ 13 мая 2010

Я пытаюсь использовать целое число в качестве числового представления строки, например, сохраняя «ABCD» как 0x41424344. Однако, когда дело доходит до вывода, я должен преобразовать целое число обратно в 4 символа ASCII. Прямо сейчас я использую битовые сдвиги и маскировку следующим образом:

int value = 0x41424344;
string s = new string (
              new char [] { 
                 (char)(value >> 24), 
                 (char)(value >> 16 & 0xFF),
                 (char)(value >> 8 & 0xFF),
                 (char)(value & 0xFF) });

Есть ли более чистый способ сделать это? Я пробовал разные приведения, но компилятор, как и ожидалось, пожаловался на это.

Ответы [ 5 ]

3 голосов
/ 13 мая 2010
int value = 0x41424344;
string s = Encoding.ASCII.GetString(
               BitConverter.GetBytes(value).Reverse().ToArray());

(Выше предполагается, что вы работаете в системе с прямым порядком байтов. Для big-endian вы можете просто отбросить часть .Reverse().ToArray(), хотя, если вы работаете в системе с прямым порядком байтов, это, вероятно, будет иметь больше смысла для вас просто сохранить "ABCD" как 0x44434241, если это возможно.)

3 голосов
/ 13 мая 2010

Символы 16-битные, поэтому вы должны кодировать их в восьмибитные значения, чтобы упаковать их в целое число. Вы можете использовать класс Encoding для преобразования между символами и байтами, а класс BitConverter для преобразования между байтами и целыми числами

Вот преобразование в обе стороны:

string original = "ABCD";

int number = BitConverter.ToInt32(Encoding.ASCII.GetBytes(original), 0);

string decoded = Encoding.ASCII.GetString(BitConverter.GetBytes(number));

Обратите внимание, что порядок байтов в целых числах зависит от порядкового номера компьютера. В системе с прямым порядком байтов числовое значение «ABCD» будет 0x44434241. Чтобы получить обратный порядок, вы можете обратить байтовый массив:

byte[] data = Encoding.ASCII.GetBytes(original);
Array.Reverse(data);
int number = BitConverter.ToInt32(data, 0);

byte[] data2 = BitConverter.GetBytes(number);
Array.Reverse(data2);
string decoded = Encoding.ASCII.GetString(data2);

Или, если вы используете framework 3.5:

int number =
  BitConverter.ToInt32(Encoding.ASCII.GetBytes(original).Reverse().ToArray() , 0);

string decoded =
  Encoding.ASCII.GetString(BitConverter.GetBytes(number).Reverse().ToArray());
0 голосов
/ 13 мая 2010

если строка никогда не длиннее 8 символов и не является строкой Hexstring, вы можете использовать базовая переменная 16 взглянет на функции преобразования из класса Convert.

string s = "ABCD";
uint i = Convert.ToUInt32( s, 16 );
MessageBox.Show( Convert.ToString( i, 16 ) );

С уважением К сожалению

0 голосов
/ 13 мая 2010
public static string ToHexString(string value)
{
    return value.Aggregate(new StringBuilder("0x"),
        (sb, c) => sb.AppendFormat("{0:x2}", (int)c)).ToString();
}
0 голосов
/ 13 мая 2010
public string ConvertToHex(string asciiString)
{
    string hex = "";
    foreach (char c in asciiString)
    {
        int tmp = c;
        hex += String.Format("{0:x2}", (uint)System.Convert.ToUInt32(tmp.ToString()));
    }
    return hex;
} 

Он преобразует строку в шестнадцатеричный формат, как вам требуется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...