2016-03-20 17 views
0

因此,我正在構建一個程序,它接收一個字符串並將其轉換爲二進制數(I.E.「A」= 01000001)。然後,如果用戶希望,它可以將該二進制數字轉換回ascii字符。下面的代碼:如何在C#中添加字符數字

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.IO; 
using System.Threading.Tasks; 

namespace NDR_011 
{ 
class Program 
{ 

    public static Byte[] BinStr(String binary) 
    { 
     var list = new List<Byte>(); 

     for (int i = 0; i < binary.Length; i += 8) 
     { 
      String t = binary.Substring(i, 8); 

      list.Add(Convert.ToByte(t, 2)); 
     } 

     return list.ToArray(); 
    } 

    public static void Print(object mess) 
    { 
     string tmp = mess.ToString().ToUpper(); 
     Console.Write(tmp); 
    } 

    private static List<string> buffer = new List<string>(); 
    private static string outfile = "C:/tmp/bytes.bin"; 
    static void Main(string[] args) 
    { 
     string tmp = ""; 
     Print("NDR 011\n"); 
     while (true) 
     { 
      Print(""); tmp = Console.ReadKey().Key.ToString().ToUpper(); 
      if (Console.CursorLeft > 0) 
      { 
       Console.SetCursorPosition(Console.CursorLeft - 1, Console.CursorTop); 
      } 
      if (tmp == ConsoleKey.F1.ToString()) 
      { 
       break; 
      } else if (tmp == ConsoleKey.F2.ToString()) 
      { 
       comp(); 

       continue; 
      } else if (tmp == ConsoleKey.F4.ToString()) 
      { 
       buffer.Clear(); 

       continue; 
      } else if (tmp == ConsoleKey.F5.ToString()) 
      { 
       Print("N "); string a = Console.ReadLine(); 
       outfile = a; 

       continue; 
      } else if (tmp == ConsoleKey.F5.ToString()) 
      { 
       outfile = "C:/tmp/bytes.bin"; 
       Print("Out file reset\n"); 

       continue; 
      } else if (tmp == ConsoleKey.F7.ToString()) 
      { 
       //Print("N "); // string a = Console.ReadLine(); 
       string a = "C:/tmp/bytes.bin"; 
       string[] s = File.ReadAllText(a).Split(' '); 
       char[] end = new char[s.Length - 1]; 
       for (int i=0;i<end.Length;i++) 
       { 
        end[i] = (char)BinStr(s[i])[0]; 
        //Print(end[i]); 
       } 
       //Print((char)BinStr(s[0])[0]); 
       if (end[0] == 'A' && end[1] == 'D' && end[2] == 'D') 
       { 
        for (int i=0+3;i<end.Length;i++) 
        { 
         int n = end[i] + end[i]; 
         Print(n); 
        } 
       } 
       //decompile(a); 

       continue; 
      } 
      while (tmp.Length > 1) 
      { 
       char a = tmp[tmp.Length - 1]; 
       tmp = a.ToString(); 
      } 
      buffer.Add(tmp); 
     } 
    } 
    static void comp() 
    { 
     if (buffer == null || buffer.Count <= 0) 
     { 
      Print("Error buffer empty"); 
      return; 
     } 
     char[] r = new char[buffer.Count]; 
     for (int i=0;i<buffer.Count;i++) 
     { 
      r[i] = Convert.ToChar(buffer[i]); 
      Print(r[i]); 
     } 
     foreach (char ch in r) 
     { 
      string a = Convert.ToString((int)ch, 2); 
      while (a.Length != 8) 
      { 
       string b = "0"; 
       a = b + a; 
      } 
      File.AppendAllText(outfile, a + " "); 
     } 
     Print("Compile done!\n"); 
    } 
    static void decompile(string filename) 
    { 

    } 
    static void run() 
    { 

    } 
} 
} 

(在indenation弄亂時,我到這個職位)

問題是這樣的:當我嘗試添加我從文件中得到,我得到的隨機數的值像:100102,和那樣的奇怪東西。我究竟做錯了什麼?由於

+0

您不允許使用內置的類/結構體來執行此操作嗎? – Ian

+0

當你在調試器中通過它時發現了什麼?它首先出錯的地方是哪裏? – HABO

+0

現在請注意,C#不會使用ASCII作爲'string'和'char'。如果您的函數僅適用於[C0控件和基本拉丁語](http://www.unicode.org/charts/nameslist/index.html)字符塊,則在輸入不符合該要求時拋出異常。 –

回答

0

這裏是你如何將字符串轉換爲1和0的二進制字符串:

var binstring = string.Join(" ", Encoding.ASCII.GetBytes(("Welcome, World!")).Select(byt => Convert.ToString(byt, 2).PadLeft(8, '0'))); 

要的是回到一個字符串轉換,我們需要解析的byte []從中陣列的方法像這樣:

public static byte[] GetBytes(string s) 
     { 
      byte[] result = new byte[(s.Length + 7)/8]; 

      int i = 0; 
      int j = 0; 
      foreach (char c in s) 
      { 
       result[i] <<= 1; 
       if (c == '1') 
        result[i] |= 1; 
       j++; 
       if (j == 8) 
       { 
        i++; 
        j = 0; 
       } 
      } 
      return result; 
     } 

然後我們得到那些字節,我們可以把它簡單地使用轉換爲字符串:

Encoding.ASCII.GetString(GetBytes(binstring)); 

參考文獻:
How could I encode a string of 1s and 0s for transport?
How to get the binary code behind ASCII (C#)

+0

謝謝你的工作! – Programmer2120