2010-10-26 11 views
19

क्या विंडोज फोन 7 में ASCIIEncoding का उपयोग करने का कोई तरीका है?विंडोज फोन में ASCIIEncoding 7

जब तक मैं कुछ गलत नहीं कर रहा हूं मौजूद नहीं है और मुझे इसे सी # -> PHP एन्क्रिप्शन के लिए जरूरी है (क्योंकि PHP केवल SHA1 एन्क्रिप्शन में ASCII का उपयोग करता है)।

कोई सुझाव?

+0

एनक्रिप्शन से संबंधित चरित्र एन्कोडिंग मानकों को कैसे करता है? जैसा कि मैं समझता हूं कि SHA1 (या कोई अन्य हैशिंग एल्गोरिदम) बाइट्स की एक धारा लेता है और एक हैश उत्पन्न करता है (बाइट्स का एक छोटा अनुक्रम भी)। चरित्र एन्कोडिंग समीकरण में कहां प्रवेश करता है? – AnthonyWJones

+0

वर्तमान में सी # (डब्ल्यूपी 7 के लिए) में एक हैश उत्पन्न करना (यूनिकोड) एक अलग हैश उत्पन्न करता है जिसके लिए PHP जेनरेट (ASCII) उत्पन्न होता है। मैंने यहां एक और सवाल देखा कि 2 अलग-अलग एन्कोडिंग का उपयोग करके 2 अलग हैश उत्पन्न होते हैं। – Dean

उत्तर

44

यह अपने आप को लागू करने के लिए आसान है, यूनिकोड ASCII कोड के साथ गड़बड़ कभी नहीं Excel में फ़ाइलों को खोलते समय गलत दिखाने के लिए वर्ण)।

चूंकि सिल्वरलाइट में एन्कोडिंग.एएससीआईआई वर्ग नहीं है, इसलिए मैंने निम्नानुसार एक कार्यान्वित किया है। यह मेरे लिए काम करता है, आशा है कि यह रूप में अच्छी तरह आप के लिए उपयोगी होता है:

/// <summary> 
/// Silverlight doesn't have an ASCII encoder, so here is one: 
/// </summary> 
public class AsciiEncoding : System.Text.Encoding 
{ 
    public override int GetMaxByteCount(int charCount) 
    { 
     return charCount; 
    } 
    public override int GetMaxCharCount(int byteCount) 
    { 
     return byteCount; 
    } 
    public override int GetByteCount(char[] chars, int index, int count) 
    { 
     return count; 
    } 
    public override byte[] GetBytes(char[] chars) 
    { 
     return base.GetBytes(chars); 
    } 
    public override int GetCharCount(byte[] bytes) 
    { 
     return bytes.Length; 
    } 
    public override int GetBytes(char[] chars, int charIndex, int charCount, byte[] bytes, int byteIndex) 
    { 
     for (int i = 0; i < charCount; i++) 
     { 
      bytes[byteIndex + i] = (byte)chars[charIndex + i]; 
     } 
     return charCount; 
    } 
    public override int GetCharCount(byte[] bytes, int index, int count) 
    { 
     return count; 
    } 
    public override int GetChars(byte[] bytes, int byteIndex, int byteCount, char[] chars, int charIndex) 
    { 
     for (int i = 0; i < byteCount; i++) 
     { 
      chars[charIndex + i] = (char)bytes[byteIndex + i]; 
     } 
     return byteCount; 
    } 
} 
+0

चाहते हैं तो यूटीएफ 8 करेगा, धन्यवाद, मैं इसे जाने देता हूं ... – Dean

+1

धन्यवाद, पूरी तरह से काम करें। – Dean

0

इस एमएस फोरम thread के अनुसार, विंडोज फोन 7 का समर्थन नहीं करता है।

+0

अच्छा, क्या इसके आसपास अन्य तरीके हैं (ईजी कस्टम क्लास या लाइब्रेरी)? या क्या फ्रेमवर्क को स्वयं ASCII का समर्थन करना है? – Dean

4

वास्तव में आपके प्रश्न में कोई विवरण नहीं दिख रहा है, यह ट्रैक से बाहर हो सकता है। आप सही हैं सिल्वरलाइट ASCII एन्कोडिंग के लिए कोई समर्थन नहीं है।

हालांकि मुझे संदेह है कि वास्तव में यूटीएफ 8 आपको जो चाहिए वह करेगा। यह ध्यान में रखते हुए कि एक बाइट ASCII केवल वर्णों का अनुक्रम और यूटीएफ -8 के रूप में एन्कोड किए गए वर्णों का एक ही सेट समान है। यूटीएफ -8 में पहले 128 सिंगल बाइट कोड पॉइंट्स द्वारा यह पूर्ण ASCII वर्ण सेट शब्दशः दोहराया गया है। (का उपयोग कर

public static byte[] StringToAscii(string s) { 
     byte[] retval = new byte[s.Length]; 
     for (int ix = 0; ix < s.Length; ++ix) { 
      char ch = s[ix]; 
      if (ch <= 0x7f) retval[ix] = (byte)ch; 
      else retval[ix] = (byte)'?'; 
     } 
     return retval; 
    } 
+3

+1। यदि आप ASCII – db42

3

मुझे लगता है कि CSV फ़ाइलों, जो ASCII में एन्कोड करने की है लिखता है एक Silverlight अनुप्रयोग है UTF-8 उच्चारण चिह्न का कारण बनता है:

1

मैं Android के लिए Xamarin (मोनो) का उपयोग कर मैं कहाँ पोर्टेबल कक्षा लाइब्रेरी का उपयोग कर रहा है और वे Econding.ASCII का समर्थन नहीं करते समान समस्या थी।

इसके बजाय, केवल काम कर समाधान (इसे मैन्युअल रूप से कर को छोड़कर) इस एक

Uri.EscapeDataString(yourString); 

this answer जो अतिरिक्त जानकारी प्रदान देखें है।

1

मैं @Hans Passant के जवाब से शुरू कर दिया और मैं Linq के साथ दुबारा लिखा:

/// <summary> 
/// Gets an encoding for the ASCII (7-bit) character set. 
/// </summary> 
/// <see cref="http://stackoverflow.com/a/4022893/1248177"/> 
/// <param name="s">A character set.</param> 
/// <returns>An encoding for the ASCII (7-bit) character set.</returns> 
public static byte[] StringToAscii(string s) 
{ 
    return (from char c in s select (byte)((c <= 0x7f) ? c : '?')).ToArray(); 
} 

आप ToArray() करने के लिए कॉल को हटाने और एक IEnumerable<byte>byte[] के बजाय वापस जाने के लिए चाहते हो सकता है।

+0

हंस के दृष्टिकोण से अधिक सुरुचिपूर्ण, लेकिन शायद कम कुशल। कभी-कभी कच्चे 'के लिए' लूप के प्रदर्शन को हरा करना मुश्किल होता है। –

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