2014-09-23 10 views
23

मेरे पास निम्न C# कोड है (एक लाइब्रेरी से मैं उपयोग कर रहा हूं) जो थंबप्रिंट की तुलना में प्रमाणपत्र ढूंढने का प्रयास करता है। ध्यान दें कि निम्नलिखित कोड में mycert.Thumbprint और certificateThumbprint दोनों स्ट्रिंग हैं।क्यों स्ट्रिंग। एक्वाल्स झूठी वापसी कर रहा है?

var certificateThumbprint = AppSettings.CertificateThumbprint; 

var cert = 
    myStore.Certificates.OfType<X509Certificate2>().FirstOrDefault(
     mycert => 
     mycert.Thumbprint != null && mycert.Thumbprint.Equals(certificateThumbprint) 
    ); 

यह थंबप्रिंट के साथ प्रमाण पत्र खोजने में विफल रहा क्योंकि mycert.Thumbprint.Equals(certificateThumbprint)false है यहाँ तक कि जब तार बराबर हैं। mycert.Thumbprint == certificateThumbprint भी false देता है, जबकि mycert.Thumbprint.CompareTo(certificateThumbprint) रिटर्न 0.

enter image description here

मैं कुछ स्पष्ट याद आ रही हो सकता है, लेकिन मैं समझ नहीं क्यों Equals विधि विफल हो रहा है। विचार?

+15

यह एक अजीब सवाल हो सकता है ... लेकिन क्या प्रत्येक स्ट्रिंग पर लम्बाई समान है?(यह देखने की कोशिश कर रहा है कि वहां किसी भी तरह के गैर-प्रिंट करने योग्य पात्र हैं)। – vcsjones

+5

['string.compareTo'] से (http://msdn.microsoft.com/en-us/library/fkw3h78a (v = vs.110) .aspx) दस्तावेज़: * कैरेक्टर सेट ** में अनजान वर्ण शामिल हैं। * * तुलनात्मक विधि इस तरह के पात्रों पर विचार नहीं करती है जब यह संस्कृति-संवेदनशील तुलना करता है। उदाहरण के लिए, यदि निम्नलिखित कोड .NET Framework 4 या बाद में चलाया जाता है, तो "एनी-माल" (सॉफ्ट मुलायम हाइफ़न या यू + 00 एडी का उपयोग करके) "जानवर" की तुलना इंगित करती है कि दो तार बराबर हैं। * –

+2

@ युवाल आपका उद्धरण उस वीसीएसजेन्स पर संदेह करने के विपरीत है। –

उत्तर

21

compareTo कुछ वर्णों पर ध्यान नहीं देता:

static void Main(string[] args) 
{ 
    var a = "asdas"+(char)847;//add a hidden character 
    var b = "asdas"; 
    Console.WriteLine(a.Equals(b)); //false 
    Console.WriteLine(a.CompareTo(b)); //0 
    Console.WriteLine(a.Length); //6 
    Console.WriteLine(b.Length); //5 

    //watch window shows both a and b as "asdas" 
} 

(यहाँ, चरित्र a को जोड़ा गया U+034F, ग्राफ़ीम योजक का संयोजन है।)

Debug mode

तो compareTo के परिणाम का एक अच्छा सूचक नहीं है बराबर में एक बग। आपकी समस्या का सबसे संभावित कारण छिपा वर्ण है। आप सुनिश्चित करने के लिए लंबाई की जांच कर सकते हैं।

अधिक जानकारी के लिए this देखें।

+0

वास्तव में, मुझे 'प्रमाणपत्र थंबप्रिंट' स्ट्रिंग की शुरुआत में दो यू + 200 ई (बाएं से दाएं चिह्न) वर्ण थे। उस समस्या को हल करना। –

+0

सभी उत्तरों में से यह सही है। ऐसी टिप्पणियां भी हैं जो इस समस्या को जोड़ने सहित सही समस्या का संकेत देती हैं http://stackoverflow.com/questions/11115511/how-to-find-certificate-by-its-thumbprint-in-c-sharp। मैं इसे स्वीकार किए गए उत्तर के रूप में चिह्नित करूंगा। इच्छा है कि मैं टिप्पणियों के लिए भी ऐसा कर सकता हूं। –

2

आप String.Equals के अधिभार का उपयोग करने का प्रयास कर सकते हैं जो StringComparison के पैरामीटर को स्वीकार करता है।

उदाहरण के लिए:

myCert.Thumbprint.Equals(certificateThumbprint, StringComparison.[SomeEnumeration]) 


कहाँ [SomeEnumeration] निम्नलिखित enumerated स्थिरांक से एक साथ बदल दिया है:

- CurrentCulture 
- CurrentCultureIgnoreCase 
- InvariantCulture 
- InvariantCultureIgnoreCase 
- Ordinal 
- OrdinalIgnoreCase 


संदर्भ MSDN प्रलेखन पाया hereenter image description here

+0

मैंने 'OrdinalIgnoreCase' के साथ प्रयास किया और परिणाम वही था (यानी झूठा)। –

0

कभी कभी जब हम डेटाबेस में डेटा सम्मिलित यह "सवाल" जैसे कुछ रिक्त स्थान संग्रहीत करता है। और जब आप इसे "प्रश्न" से तुलना करने की कोशिश करेंगे तो यह झूठा होगा। तो मेरा सुझाव है: कृपया डेटाबेस में मान की जांच करें या ट्रिम() विधि का उपयोग करें।

आपके मामले में, प्रयास करें: mycert.Thumbprint = अशक्त & & mycert.Thumbprint.trim() बराबर (certificateThumbprint.trim())

मुझे लगता है कि यदि कोई यह सच वापस आ जाएगी। रिकॉर्ड मौजूद होगा।

संबंधित मुद्दे