2017-05-30 8 views
-1

今は、8 Base Binaryをテキストに変換するC#プログラムを作成しようとしています。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

まず、コードはコンパイルされません。ここにエラー/間違いがあります。

  • 最初のものは、あなたの関数の最初の行で、あなたはchar[]を返しますが、それを変数に割り当てるには、あなたの試み(コード)int[]を入力String.ToArray()を使用して配列に入力文字列を変換していますさ。これは、int[]char[]またはvarのいずれかに置き換えることで解決できます。
  • 2番目のループの2番目のループ(k = 0; k > 7)の内部では、Math.Pow()を使用し、その戻り値をint変数(Squared)に割り当てます。しかし、Math.Powはdoubleを返します。これを解決するには、返り値Math.Powintにキャストします。好き。 int Squared = (int)Math.Pow(2, k);
  • 最後のものは最初の2つのように簡単に解決できません。コードが正確ではないからです。 StringBuilderの変数であるtranslatedを返そうとしています。しかし、あなたの関数は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); 
関連する問題