2009-06-29 8 views
1

J'ai la chaîne suivante: \\\?\hid#vid_04d8pid_003f#62edf110800000#{4d1e55b2-f16f-11cf-88cb-001111000030} stockée dans une variable de chaîne (à partir d'un appel de fonction) appelée devPathNamePourquoi string.contains() retourne false?

et ce qui suit défini: const string myDevice = @"vid_04d8pid_003f";

mais le code suivant Evalue toujours false:

Boolean test = true; 

test = devPathName.Contains(myDevice); 

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

Il retourne vrai sur ma machine. Vous pouvez fournir plus d'informations sur le contexte de ce code et sur la façon dont vous testez. –

Répondre

2

En supposant que vous avez déjà vérifié pour la lettre « O » vs chiffre « 0 » et des choses semblables, je vous suggère que la chaîne que vous voyez dans la La variable de chaîne devPathName est en cours d'encodage pour l'affichage et n'est pas tout à fait ce que vous pensez.

Par exemple, si la chaîne contient le caractère \x000d (Control-M), le débogueur Visual Studio affiche ce que \r lorsque vous inspectez la valeur de la chaîne.

Ou, pour un autre exemple, si la chaîne contient la séquence 3504 (trois-cinq-zéro-quatre) mais que vous recherchez plutôt 35O4 (trois-cinq-oh-quatre), vous ne trouverez pas de correspondance.

(en fonction de votre police, vous ne pouvez pas être en mesure de voir les différences entre certains caractères. Comparer « 0O1lB8S5 » avec « 0O1lB8S5 » dans différentes polices pour voir ce que je veux dire.)

+0

Hhmmm .... voulez-vous dire que j'ai besoin de le convertir en utilisant UnicodeEncoding? En fait, je récupère cette chaîne à partir d'un IntPtr ('devPathName = Marshal.PtrToStringAuto (pdevPathName);') mais pourriez-vous expliquer ce que vous voulez dire? Merci –

+0

@ dark-star1 - mis à jour ma réponse avec une précision, j'espère que c'est plus clair. – Bevan

+0

Vous et Pat semble avoir mis le doigt sur la tête. essayer d'utiliser le chemin. * a lancé des exceptions montrant qu'il y a un «\ r» et un «\ n» quelque part. Je devine que c'est au début de la chaîne retournée. Existe-t-il un moyen de contourner cette étape ou dois-je copier la chaîne, la modifier puis la tester pour ma sous-chaîne? –

7

Lorsque je place ton code en C#, le compilateur n'aime pas la partie "\ h" de ta longue chaîne. Il dit "séquence d'échappement non reconnue". Cela pourrait-il être votre problème?

Oh, et si je mets un "@" avant la longue chaîne, la méthode contains() renvoie true.

HTH,

-Dan

+0

Je reçois aussi ces résultats. – JeffH

0

Cela retourne vrai pour moi bien.


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

Je suppose que je mettrais un point d'arrêt et assurez-vous que devPathName isnt être changé sur vous et que la valeur est ce que vous attendez.

+0

devPathName est renvoyé ainsi: devPathName = Marshal.PtrToStringAuto (pdevPathName); et pdevPathName: pdevPathName = new IntPtr (deviceDetailDataBuffer.ToInt32() + 4); J'ai essayé tous les éléments suivants: 1) Path.GetFullPath() => renvoie une exception disant qu'il y a des caractères de contrôle (\ r \ n), mais supprimer les 4 premiers caractères se débarrasse de ce problème. 2) supprimer les 8 premiers caractères de sorte que la chaîne commence avec ma sous-chaîne requise. Renvoie toujours false. –

+0

De quel type est deviceDetailDataBuffer? Est-ce une décimale? D'où vient la valeur? Vous pouvez créer une fonction pour vérifier uniquement les lettres/chiffres et la ponctuation pour supprimer les caractères d'échappement. Voir Char.IsLetterOrDigit et Char.IsPunctuation. – SwDevMan81

+0

deviceDetailDataBuffer est un IntPtr retourné par une fonction, et les fonctions intégrées string.Replace() peuvent apparemment supprimer les caractères d'échappement. –

0

Qu'est-ce qui évalue false, votre variable de test ou une partie de l'affichage dans statusLabel.text? Etes-vous sûr que l'affichage n'est pas quelque chose comme ceci:

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 

et peut-être que vous ne regardez que la première ligne de cette chaîne?

0

Vous avez juste besoin d'échapper à la longue chaîne avant l'analyse via .Contains()

Mettre un au symbole (@) au début de la chaîne, comme l'a démontré dans plusieurs des réponses précédentes et il devrait évaluer parfaitement.

Quand entrer dans .Contains, la chaîne initiale, dans votre cas

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

contient des caractères non-échappé et provoque .Contains de mettre fin avant de terminer la comparaison.

+0

Malheureusement, je ne peux pas y échapper, car cette chaîne est supposée être le chemin vers un périphérique renvoyé par une fonction setupapi *. Savez-vous d'une manière/fonction qui me permettrait de filtrer les caractères de contrôle tels que '\ r' et '\ n'? –

+0

Je pense que votre seule option dans ce cas est de l'enregistrer en tant que variable locale et faire tout ce que vous devez avant de le passer à. Contient Si la fonction que vous lui transmettez n'a pas la possibilité de le retourner comme une chaîne "sûre". –

+0

J'ai finalement compris. J'ai regardé le débogueur quand j'ai remarqué que la chaîne renvoyée qui décrit l'appareil avait un «&» entre chaque partie décrivait l'appareil. Donc bien que la chaîne affichée soit: \\\? \ Hid # vid_04d8pid_003f # 62edf110800000 # {4d1e55b2-f16f-11cf-88cb-001111000030}. La chaîne actuelle dans le tampon est: \\\? \ Hid # vid_04d8 & pid_003f # 6 & 2edf1108 & 0 & 0000 # {4d1e55b2-f16f-11cf-88cb-001111000030} –

Questions connexes