2009-06-29 4 views
1

я следующую строку: \\\?\hid#vid_04d8pid_003f#62edf110800000#{4d1e55b2-f16f-11cf-88cb-001111000030} хранится в строковой переменной (от вызова функции) называется devPathNameПочему string.contains() возвращает false?

и следующие определены: const string myDevice = @"vid_04d8pid_003f";

, но следующий код всегда имеет значение ложь:

Boolean test = true; 

test = devPathName.Contains(myDevice); 

statusLabel.Text += "\n\tThe value of test: " + test.ToString(); 
+2

Он возвращает true на моей машине. Возможно, вы захотите предоставить дополнительную информацию о контексте этого кода и способах тестирования. –

ответ

2

Предполагая, что вы уже проверили на букву «O» против цифры «0» и тому подобные вещи, я бы предположить, что строка, которую вы видите в строковая переменная devPathName кодируется для отображения и не совсем то, что вы думаете.

Например, если строка содержит символ \x000d (Control-M), то Visual Studio отладчик покажет это как \r, когда вы проверяете значение строки.

Или, в другом случае, если строка содержит последовательность 3504 (три-пять-ноль-четыре), но вместо этого вы ищете 35O4 (три-пять-о-четыре), то вы не найдете соответствия.

(в зависимости от вашего шрифта, вы не можете быть в состоянии увидеть различие между некоторыми персонажами. Сравнить «0O1lB8S5» с «0O1lB8S5» в различных шрифтах, чтобы увидеть, что я имею в виду.)

+0

Hhmmm .... Вы имеете в виду, что мне нужно преобразовать его с помощью UnicodeEncoding? Я действительно извлекаю эту строку из IntPtr ('devPathName = Marshal.PtrToStringAuto (pdevPathName);'), но не могли бы вы объяснить, что вы имеете в виду? Спасибо –

+0

@ dark-star1 - обновил мой ответ с разъяснением, надеюсь, что это яснее. – Bevan

+0

Вы и Пэт, кажется, ударили ноготь по голове. пытаясь использовать Путь. * Бросил исключения, показывающие, что там где-то есть «\ r» и «\ n». Я предполагаю, что это в начале возвращаемой строки. Есть ли способ сделать это, или мне нужно скопировать строку, изменить, а затем проверить ее для моей подстроки? –

7

Когда я вставляю свой код в C#, компилятор не любит часть «\ h» вашей длинной строки. В нем говорится «непризнанная escape-последовательность». Это может быть ваша проблема?

О, и если я поставил «@» перед длинной строкой, метод contains() вернет true.

НТН,

Дан

+0

Я тоже получаю эти результаты. – JeffH

0

Это возвращает истину для меня Что ж.


using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Text; 
using System.Windows.Forms; 

namespace WindowsApplication1 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      const string myDevice = @"vid_04d8pid_003f"; 
      string devPathName = @"\\\?\hid#vid_04d8pid_003f#62edf110800000#{4d1e55b2-f16f-11cf-88cb-001111000030}"; 
      Boolean test =devPathName.Contains(myDevice); 
      MessageBox.Show("\n\tThe value of test: " + test.ToString()); 
     } 
    } 
} 

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

+0

devPathName возвращается таким образом: devPathName = Marshal.PtrToStringAuto (pdevPathName); и pdevPathName: pdevPathName = new IntPtr (deviceDetailDataBuffer.ToInt32() + 4); Я пробовал все: 1) Path.GetFullPath() => возвращает и исключает, говоря, что есть управляющие символы (\ r \ n), но удаление первых 4 символов избавляется от этой проблемы. 2) удаление первых 8 символов, чтобы строка начиналась с моей требуемой подстроки. Все еще возвращает false. –

+0

Какой тип deviceDetailDataBuffer? Является ли оно десятичным? Откуда взялась эта ценность? Вы можете создать функцию для проверки только букв/цифр и знаков препинания, чтобы удалить любые escape-характеристики. См. Char.IsLetterOrDigit и Char.IsPunctuation. – SwDevMan81

+0

deviceDetailDataBuffer - это IntPtr, возвращаемый функцией, а встроенные функции string.Replace() могут, по-видимому, удалять escape-символы. –

0

Что оценивает значение false, ваша тестовая переменная или часть отображения в statusLabel.text? Вы уверены, что дисплей не такой:

The value of test: false 
The value of test: false 
The value of test: false 
The value of test: false 
The value of test: true 
The value of test: false 

и, может быть, вы смотрите только на первую строку этой строки?

0

Вам просто нужно бежать длинную строку перед разбором его через .Contains()

Положить в-символ (@) в начале строки, как показано в некоторых из предыдущих ответов и он должен отлично оценивайте.

Когда вступают в .Contains, начальную строку, в вашем случае

\\\?\hid#vid_04d8pid_003f#62edf110800000#{4d1e55b2-f16f-11cf-88cb-001111000030}" 

содержит не маскирование символов и вызывает .Contains прекратить до завершения сравнения.

+0

К сожалению, я не могу избежать этого, о котором я знаю, поскольку эта строка должна быть путём к устройству, возвращенному из функции setupapi *. Вы знаете способ/функцию, которые позволят мне отфильтровать контрольные символы, такие как «\ r» и «\ n»? –

+0

Я думаю, что ваш единственный вариант в этом случае состоит в том, чтобы сохранить его как локальную переменную и делать все, что вам нужно, прежде чем передать его. Содержит Если функция, с которой вы передаете ее, не имеет возможности вернуть ее как «безопасную» строку. –

+0

Я, наконец, понял это. Я наблюдаю за отладчиком, когда заметил, что возвращаемая строка, описывающая устройство, имела «&» между каждой частью, описывала устройство. Поэтому, хотя отображаемая строка: \\\? \ Hid # vid_04d8pid_003f # 62edf110800000 # {4d1e55b2-f16f-11cf-88cb-001111000030}. Фактическая строка в буфере: \\\? \ Hid # vid_04d8 & pid_003f # 6 & 2edf1108 & 0 & 0000 # {4d1e55b2-f16f-11cf-88cb-001111000030} –

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