2011-08-12 19 views
12

मैं इसमें कुछ प्रिंट न हो सकने ASCII वर्ण के साथ एक स्ट्रिंग की तरह कुछ है के साथ प्रिंट न हो सकने ASCII की जगह हेक्स कोड संख्याओं का प्रतिनिधित्व, इसलिए मुझे ऐसा कुछ मिलता है:नेट हेक्स कोड की स्ट्रिंग प्रतिनिधित्व

"ABCD[09][05][0D][0A]" 

ऐसा करने का सबसे अच्छा तरीका क्या है? क्या रेगेक्स का उपयोग किया जा सकता है?

उत्तर

23

पैटर्न \p{Cc} कोई नियंत्रण चरित्र से मेल खाता है, तो

Regex.Replace(input, 
       @"\p{Cc}", 
       a=>string.Format("[{0:X2}]", (byte)a.Value[0]) 
      ); 

भी नियंत्रण वर्ण की जगह लेंगे।

+0

अच्छा। सरल और पालन करने में आसान है। – user380689

+0

ध्यान दें कि आप इसे मूल संदेश में आसानी से वापस नहीं कर सकते हैं क्योंकि "एबीसीडी [0 9] \ x09 \ x05 \ r \ n" परिणामस्वरूप "एबीसीडी [0 9] [0 9] [05] [0 डी] [0 ए] "। आप उद्घाटन ब्रेस से बचना चाहते हैं (आमतौर पर "[[" का उपयोग करना ताकि मेरा उदाहरण "एबीसीडी [[0 9] [0 9] [05] [0 डी] [0 ए]" बन जाए। –

8
string s = "ABCD\x09\x05\r\n"; 
var replace = 
    s.Select(c => Char.IsControl(c) ? ((int)c).ToString("X2") : c.ToString()) 
    .Aggregate(new StringBuilder(), (sb, t) => sb.Append(t)) 
    .ToString(); 

क्षमा करें, कोई कंपाइलर आसान नहीं है, लेकिन मुझे लगता है कि यह संकलित करता है और काम करता है।

इसके अलावा, इस तरह की स्ट्रिंग दो बार चलती है (एक बार प्रत्येक चरित्र को हेक्स प्रतिस्थापन या स्ट्रिंग में प्रोजेक्ट करने के लिए, और फिर फिर से एकत्र करने के लिए), और आप Enumerable.Aggregate पर कॉल में प्रक्षेपण को लंपकर इससे बच सकते हैं, लेकिन यह अधिक स्पष्ट है और यह संभवतः इससे कोई फर्क नहीं पड़ता जब तक कि यह प्रदर्शन-महत्वपूर्ण न हो।

+0

अहघ। कुछ मिनटों से मुझे मारो। LINQPad के माध्यम से काम करने की पुष्टि की। –

+1

आह, धन्यवाद, मुझे अस्पष्ट संस्करण को देखने से नफरत होगी। –

+0

+1; महान उदाहरण कोड। अब मुझे 'कुल' के लिए उपयोग खोजने में एक पायदान मिला है :) मैं पठनीयता के लिए व्यक्तिगत रूप से चुनिंदा फ़ंक्शन को स्थानीय प्रतिनिधि में धक्का दूंगा। –

4

जेसन के उदाहरण से प्रेरित, लेकिन थोड़ा सा सरल। मुझे यकीन है कि जो बेहतर प्रदर्शन करती है नहीं कर रहा हूँ, और अभी यह बेंचमार्क के लिए समय नहीं है, लेकिन यह सिर्फ एक पास में सब कुछ करना चाहिए:

string s = "ABCD\x09\x05\r\n"; 
string replace = String.Concat(s.Select(c => Char.IsControl(c) ? 
              String.Format("[{0:X2}]", (int)c) : 
              c.ToString())); 

मैं कार्यक्षमता के लिए इस परीक्षण किया है।

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