получение строки из байта [] в C # - PullRequest
1 голос
/ 15 мая 2009

У меня странная проблема. У меня есть форма с меткой для вывода текста в определенных точках программы вместо вывода на консоль. Учитывая следующий код:

result = SetupDiGetDeviceRegistryProperty(deviceInfoSet, ref tBuff, 
                                          (uint)SPDRP.DEVICEDESC,
                                          out RegType, ptrBuf, 
                                          buffersize, out RequiredSize); 

if (!result)
{
    errorMessage = new Win32Exception(Marshal.GetLastWin32Error()).Message;
    statusLabel.Text += "\nSetupDiGetDeviceRegistryProperty failed because "
                        + errorMessage.ToString();
}
else
{
    statusLabel.Text += "\nPtr buffer length is: " + ptrBuf.Length.ToString();

    sw.WriteLine(tCode.GetString(ptrBuf) );

    sw.WriteLine("\n");
    // This is the only encoding that will give any legible output.
    // Others only show the first character "U"
    string tmp = tCode.GetString(ptrBuf) + "\n"; 

    statusLabel.Text += "\nDevice is: " + tmp + ".\n";                    
}

Я получаю только один идентификатор оборудования на этикетке. Этот кусок кода находится в конце моего цикла. 1-го это заставило меня подумать, что мой цикл был каким-то образом зависшим, но когда я решил направить вывод в файл, я получил почти то, что хотел, и вывод за пределы цикла. Кто-нибудь может сказать мне, что здесь происходит? Все, что я хочу, это получить строку, представляющую идентификатор оборудования из байта [] ( ptrBuf ). Кто-нибудь может объяснить, что здесь происходит, пожалуйста? Моя рабочая среда - MSVstudio 2008 Express. В windows 7.

Спасибо

Ответы [ 4 ]

3 голосов
/ 15 мая 2009

Вы, к сожалению, не показали, что такое tCode.

Глядя на документы для вызова API , похоже, что он должен быть заполнен REG_SZ. Я подозреваю это Юникод, т.е.

string property = Encoding.Unicode.GetString(ptrBuf, 0, RequiredSize);

должен преобразовать его.

Однако, если вы ожидаете нескольких значений, мне интересно, будет ли это строка, разделенная '\0': попытка вывести ее в элемент управления Win32 действительно остановится на первом '\0'.

Попробуйте это:

string property = Encoding.Unicode.GetString(ptrBuf, 0, RequiredSize);
                                  .Replace('\0', ' ');

Это должно (если я правильно угадываю) разделить значения пробелом.

2 голосов
/ 15 мая 2009

Вам необходимо указать кодировку:

// C# to convert a byte array to a string.
byte [] dBytes = ...
string str;
System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding();
str = enc.GetString(dBytes);
1 голос
/ 15 мая 2009

прости, я должен был сказать. UnicodeEncoding tCode = new UnicodeEncoding(); и спасибо, скит, я не знал об этой маленькой информации о средствах управления Win32. Я приложу усилия, чтобы исправить это. Я не пытался неявно преобразовать байты в символы (или строки). Я постараюсь быть более подробным в будущем.

Спасибо всем за ответ.

0 голосов
/ 15 мая 2009

Вы не можете неявно преобразовать байт в строку. Вы должны выбрать метод кодирования (возможно, Unicode или ASCII) для преобразования. Байт хранит числовое значение, которое может представлять символ (или некоторые другие данные), но по сути ничего не значит. Это философский эквивалент преобразования целого числа в строку. Вы можете решить сделать прямое преобразование значения или вы можете получить некоторое значение из значения (то есть, используя таблицу ASCII: 13 = TAB).

Значение, возвращаемое функцией, которую вы перечислили, скорее всего, вернуло байтовый массив, представляющий некоторое строковое значение, однако вам нужно найти соответствующий метод кодирования для преобразования его в пригодную для использования строку.

Надеюсь, это помогло!

Эрик

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