2017-05-30 71 views
-1

現在我嘗試編寫一個C#程序來將8個基本二進制文件翻譯成文本。C#函數來翻譯二進制代碼

但我想我對C#沒有足夠的經驗來真正使它工作。

我覺得我的代碼拿出,應該從邏輯角度的視圖有些做我想做的,但語法不正確這樣做,因爲鴕鳥政策更好地瞭解它。

這是我到目前爲止有:

using System; 
using System.Linq; 
using System.Text; 

class binaryTranslate 
{ 
    public int convertBin(string CodeInput) 
    { 
     int [] code = CodeInput.ToArray(); 
     int CodeCount = code.ToString().Length; 
     int EightBaseSegAmount = CodeCount/8; 
     int ByteCapacity = 8; 
     StringBuilder translated = new StringBuilder(); 

     for (var i = 1; i < EightBaseSegAmount + 1; i++) 
     { 
      StringBuilder Byte = new StringBuilder(ByteCapacity); 
      int ByteStart = (i * 8) - 8; 
      int ByteEnd = (i * 8) - 1; 
      int ByteIncrement = 1; 

       for (var j = ByteStart ; j < ByteEnd + 1; j++) 
       { 
        Byte.Append(code[j]); 
       } 

      for (var k = 0; k > 7; k++) 
      { 
       int BitValue = 128; 


       if (Byte[k] == 1) 
       { 
        if (k > 0) 
        { 
         int Squared = Math.Pow(2, k); 
         ByteIncrement += BitValue/Squared; 
        } 
        else 
        { 
         ByteIncrement += BitValue; 
        } 
       } 

      } 
      char toSymbol = Convert.ToChar(ByteIncrement); 
      translated.Append(toSymbol); 
     } 

     return translated; 
    } 

    public static int Main() 
    { 
     convertBin("010010000110000101101100011011000110111100100001"); 
    } 
} 
+0

什麼是不工作?更詳細地描述問題,而不是僅僅說「語法不正確」。 –

+1

你可以試試這個[答案](https://stackoverflow.com/questions/6006425/binary-to-corresponding-ascii-string-conversion) – Vijay

+1

'convertBin'應該是靜態的,因爲我假定這是一個控制檯應用。你的程序也不會輸出任何東西。 – DrNachtschatten

回答

0

如果你真的轉換爲字符串的代碼看起來應該是這樣

namespace binaryTranslate 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 

      //convertBin("01001000 01100001 01101100 01101100 01101111 00100001"); 
      string results = BinaryTranslate.convertBin(new byte[] { 0x44, 0x61, 0x6c, 0x6c, 0x6f, 0x21 }); 
     } 
    } 
    public class BinaryTranslate 
    { 
     public static string convertBin(byte[] CodeInput) 
     { 
      return string.Join("", CodeInput.Select(x => x.ToString("X2"))); 

     } 
    } 
} 
0

這應該做的伎倆。

public static string FromBinary(string binary) 
{ 
    int WordLength = 8; 

    binary = binary.Replace(' ', ''); 
    while(binary.Length % WordLength != 0) 
     binary += "0"; 

    string output = String.Empty; 
    string word = String.Empty; 
    int offset = 0; 

    while(offset < binary.Length) 
    { 
     int tmp = 0; 
     word = binary.Substring(offset, 8); 
     for(int i=0; i<(WordLength - 1); i++) 
      if(word[i] == '1') 
       tmp += (int) Math.Pow(2, i); 

     output += Convert.ToChar(tmp); 
     offset += WordLength; 
    } 

    return output; 
} 
2

首先,你的代碼不會編譯。這是錯誤/錯誤。

  • 第一個是,在你的函數的第一行中,在輸入字符串轉換爲使用String.ToArray()陣列,它返回一個char[]但你嘗試將它分配給一個變量(代碼)輸入int[]。您可以通過將int[]替換爲char[]var來解決此問題。
  • 第二個是,在循環(k = 0; k > 7)的第二個內部,使用Math.Pow()並將其返回值分配給int變量(平方)。但Math.Pow返回一倍。您可以通過將返回值Math.Pow轉換爲int來解決此問題。喜歡; int Squared = (int)Math.Pow(2, k);
  • 最後一件事情不像前兩個那樣容易解決,因爲你的代碼不完全正確。您正試圖返回一個名爲translated的東西,這是一個類型爲StringBuilder的變量。但是你的函數被定義爲返回一個int

現在,這些都是編譯錯誤。有一堆邏輯和決策錯誤/錯誤。你的算法也不是很正確。

這是您可以使用/檢查的示例代碼。我想進一步幫助你,爲什麼你的代碼不正確,你的設計錯誤是什麼,如果你想。

class binaryTranslate 
{ 
    public enum IncompleteSegmentBehavior 
    { 
     Skip = 0, 
     ZerosToStart = 1, 
     ZerosToEnd = 2 
    } 

    private byte ConvertBinstrToByte(string sequence) 
    { 
     if (string.IsNullOrEmpty(sequence)) 
      return 0; // Throw? 

     if (sequence.Length != sizeof(byte) * 8) 
      return 0; // Throw? 

     const char zero = '0'; 
     const char one = '1'; 

     byte value = 0; 
     for (int i = 0; i < sequence.Length; i++) 
     { 
      if (sequence[i] != zero && sequence[i] != one) 
       return 0; // Throw 

      value |= (byte)((sequence[i] - zero) << (7 - i)); 
     } 

     return value; 
    } 

    private string HandleIncompleteSegment(string segment, int segmentSize, IncompleteSegmentBehavior behavior) 
    { 
     string result = null; 

     var zeroAppender = new StringBuilder(); 
     for (int i = 0; i < segmentSize - segment.Length; i++) 
      zeroAppender.Append('0'); 

     var zeros = zeroAppender.ToString(); 

     switch (behavior) 
     { 
      case IncompleteSegmentBehavior.Skip: 
       break; 
      case IncompleteSegmentBehavior.ZerosToStart: 
       result = zeros + result; 
       break; 
      case IncompleteSegmentBehavior.ZerosToEnd: 
       result = result + zeros; 
       break; 
      default: 
       break; 
     } 

     return result; 
    } 

    public byte[] ConvertBinstrToBytes(string binarySequence, IncompleteSegmentBehavior behavior = IncompleteSegmentBehavior.Skip) 
    { 
     var segmentSize = sizeof(byte) * 8; 

     var sequenceLength = binarySequence.Length; 

     var numberOfBytes = (int)Math.Ceiling((double)sequenceLength/segmentSize); 
     var bytes = new byte[numberOfBytes]; 

     for (int i = 0; i < numberOfBytes; i++) 
     { 
      var charactersLeft = sequenceLength - i * segmentSize; 
      var segmentLength = (charactersLeft < segmentSize ? charactersLeft : segmentSize); 
      var segment = binarySequence.Substring(i * segmentSize, segmentLength); 

      if (charactersLeft < segmentSize) 
      { 
       segment = HandleIncompleteSegment(segment, segmentSize, behavior); 
       if (segment == null) 
        continue; 
      } 

      bytes[i] = ConvertBinstrToByte(segment); 
     } 

     return bytes; 
    } 
} 

此代碼傳遞這些斷言。

var bytes = new binaryTranslate() 
    .ConvertBinstrToBytes("00000000"); 

Assert.Equal(bytes.Length, 1); 
Assert.Equal(bytes[0], 0b00000000); 

bytes = new binaryTranslate() 
    .ConvertBinstrToBytes("10000000"); 

Assert.Equal(bytes.Length, 1); 
Assert.Equal(bytes[0], 0b10000000); 

bytes = new binaryTranslate() 
    .ConvertBinstrToBytes("11111111"); 

Assert.Equal(bytes.Length, 1); 
Assert.Equal(bytes[0], 0b11111111); 

bytes = new binaryTranslate() 
    .ConvertBinstrToBytes("00000001"); 

Assert.Equal(bytes.Length, 1); 
Assert.Equal(bytes[0], 0b00000001); 

bytes = new binaryTranslate() 
    .ConvertBinstrToBytes("1100110000110011"); 

Assert.Equal(bytes.Length, 2); 
Assert.Equal(bytes[0], 0b11001100); 
Assert.Equal(bytes[1], 0b00110011);