2010-10-26 44 views
19

Có cách nào để sử dụng ASCIIEncoding trong Windows Phone 7 không?ASCIIEncoding Trong Windows Phone 7

Trừ khi tôi đang làm sai điều gì đó không tồn tại và tôi cần nó để mã hóa C# -> PHP (vì PHP chỉ sử dụng ASCII trong mã hóa SHA1).

Mọi đề xuất?

+0

Tiêu chuẩn mã hóa ký tự liên quan đến sự hấp thu như thế nào? Theo tôi hiểu nó SHA1 (hoặc bất kỳ thuật toán băm khác) có một dòng byte và tạo ra một băm (cũng là một chuỗi ngắn của byte). Mã hóa ký tự nhập vào phương trình ở đâu? – AnthonyWJones

+0

Hiện tại việc tạo một Hash trong C# (Đối với WP7) (Unicode) tạo ra một băm khác mà PHP tạo ra (ASCII). Tôi thấy một câu hỏi khác ở đây nói rằng bằng cách sử dụng 2 mã hóa khác nhau tạo ra 2 hash khác nhau. – Dean

Trả lời

44

Nó rất dễ dàng để thực hiện chính mình, Unicode không bao giờ sai lầm với các mã 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; 
    } 
+0

Cảm ơn, Ill cho nó một đi ... – Dean

+1

Cảm ơn, làm việc hoàn hảo. – Dean

0

Theo diễn đàn MS thread, Windows Phone 7 không hỗ trợ .

+0

Vâng, có những cách khác xung quanh (lớp học hoặc thư viện tùy chỉnh của E.G.) không? Hay bản thân Framework có hỗ trợ ASCII không? – Dean

4

Không thực sự thấy bất kỳ chi tiết nào trong câu hỏi của bạn, điều này có thể không đúng. Bạn đúng Silverlight không hỗ trợ mã hóa ASCII.

Tuy nhiên tôi nghi ngờ rằng trên thực tế UTF8 sẽ làm những gì bạn cần. Giá trị của nó mang trong tâm trí rằng một chuỗi các ký tự chỉ ASCII byte đơn và cùng một bộ ký tự được mã hóa dưới dạng UTF-8 giống hệt nhau. Đó là bộ ký tự ASCII hoàn chỉnh được lặp lại nguyên văn bởi 128 điểm mã byte đơn đầu tiên trong UTF-8.

+3

+1. UTF8 sẽ làm gì nếu bạn muốn ASCII – db42

3

Tôi có một ứng dụng Silverlight mà viết file CSV, mà phải được mã hóa trong ASCII (sử dụng UTF-8 nguyên nhân có dấu để hiển thị sai khi bạn mở tệp trong Excel).

Vì Silverlight không có lớp Mã hóa.ASCII, tôi đã triển khai một lớp như sau. Nó làm việc cho tôi, hy vọng nó hữu ích cho bạn cũng như:

/// <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; 
    } 
} 
1

Tôi có vấn đề tương tự như sử dụng Xamarin (Mono) dành cho Android mà tôi đang sử dụng di động Class Library và họ không hỗ trợ Econding.ASCII.

Thay vào đó, các giải pháp làm việc chỉ (ngoại trừ làm nó bằng tay) là này một

Uri.EscapeDataString(yourString); 

Xem this answer mà cung cấp thêm thông tin.

1

tôi bắt đầu từ câu trả lời @Hans passant 's và tôi viết lại nó với 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(); 
} 

Bạn có thể muốn loại bỏ các cuộc gọi đến ToArray() và trả về một IEnumerable<byte> thay vì byte[].

+0

Thanh lịch hơn, nhưng có lẽ kém hiệu quả hơn nhiều so với cách tiếp cận của Hans. Đôi khi thật khó để đánh bại hiệu suất của vòng lặp 'for' thô. –