2011-12-14 104 views
5

Nếu tôi muốn viết một mật mã Caesar C# tôi có phải trải qua mọi trường hợp không? Nó không có ý nghĩa với tôi để chuyển đổi sang ASCII hoặc UTF (có lẽ bởi vì tôi không hiểu nó sẽ hoạt động như thế nào). Tôi chỉ cần một điểm đúng hướng.Mật mã Caesar trong C#

Tôi có nên gán từng chữ cái cho các số 1-26 không?

Trả lời

2

Bạn có thể đặt từng chữ cái vào một mảng và sử dụng chỉ mục mảng (gói ở cuối) hoặc bạn có thể chỉ cần sử dụng giá trị asccii của chữ cái và bọc cho chữ cái đầu tiên khi đến cuối cùng. Bí quyết ở đây là tất cả các ký tự được sắp xếp coninuously, bắt đầu từ A = 0x41

+0

Cảm ơn bạn! Điều này có ý nghĩa với tôi, tôi đã không nhận ra rằng tôi có thể làm điều đó (tôi là một người mới bắt đầu hoàn chỉnh!). –

1

Đối với một Cypher Caesar truyền thống, bạn sẽ kiểm tra một char nằm trong phạm vi [a-z] hoặc [A-Z], và chỉ chuyển nó theo cách khác.

Cách khác là xử lý tất cả các ký tự theo cùng một cách, do đó không chỉ trở thành b, mà µ trở thành ¶ và bạn quấn quanh U + 10FFFF (điểm mã cao nhất trong Unicode) trở thành U + 0000 không phải là ký tự và sau đó là ký tự rỗng, nhưng không có lý do gì khiến một số string không thể giữ chúng để truyền sang một nơi khác. , bạn chỉ cần thêm 1 vào giá trị của mỗi char và bọc U + FFFF đến U + 0000. Đầu ra có thể trở thành chuỗi UTF-16 không hợp lệ (vì nó có thể đã khớp nhầm surrogates, nhưng điều đó sẽ không ngăn bạn từ chuyển nó xung quanh trong một string, và sau đó decyphering nó một lần nữa. Xét cho cùng, mã hóa hiện đại cũng không dẫn đến các chuỗi hợp lệ.

+0

Đây là những gì tôi không hiểu, nếu tôi muốn giải mã một câu đơn giản và tôi chuyển nó sang mã tôi có thể giới hạn phạm vi để khi tôi muốn 'z' để là 'b' chẳng hạn, tôi có luôn phải đi qua lại không, tôi có thể làm cho nó tương tự như bánh xe không? Và cảm ơn câu trả lời. –

+0

Đó là một vấn đề của spec hơn là công việc (thật đáng buồn, hầu hết các biến chứng trong cuộc sống thực là như thế này, lập trình dễ dàng hơn là làm việc ra những gì khách hàng thực sự muốn). Tôi muốn nói điều đầu tiên là * có lẽ * những gì đã được dự định. Bạn có ý nghĩa gì bởi "không tương tự như bánh xe", bất kỳ biến thể nào của cypher Caesar cũng tương tự như bánh xe. –

+0

Tôi có nghĩa là gói - như tôi phát hiện ra từ một câu trả lời =) - Tôi nên viết _can't tôi làm cho nó tương tự_. Tôi vẫn quen với các điều khoản. –

2

lẽ úp mở sẽ là hữu ích - bạn nói rằng bạn không muốn sao chép hoặc được cho biết câu trả lời:

  • Hãy xem xét rằng C# có toán tử mô đun, ở dạng a = b% c - tức là phần còn lại của b chia cho c. Khi c = n và b = n, a = 0. Khi c = n và b = n + 1, a = 1. Thử nghiệm với hành vi của toán tử này.
  • Bạn có thể khai báo mảng tĩnh trong C# với initialisers: char[] chars = new char[]{'a', 'b',...};
+0

Cũng là một trợ giúp tuyệt vời, cảm ơn bạn! –

1

Đây là cách tiếp cận của tôi.

public static string Encrypt(string str, int n) 
    { 
     return string.Join("", str.Select(x => Encrypt(x, n))); 
    } 

    public static string Decrypt(string str, int n) 
    { 
     return string.Join("", str.Select(x => Decrypt(x, n))); 
    } 

    public static char Encrypt(char chr, int n) 
    { 
     int x = chr - 65; 

     return (char)((65) + ((x + n) % 26)); 
    } 

    public static char Decrypt(char chr, int n) 
    { 
     int x = chr - 65; 

     return (char)((65) + ((x - n) % 26)); 
    } 

P.S.

Chỉ hoạt động đối với chữ in hoa.

Đọc bài viết trên Wikipedia: Caesar cipher

Các vấn đề liên quan