2012-02-10 14 views
6

私はブール値が92のブール値リストを持っています。リストを文字列に変換したいのですが、私は8ブール(ビット)をとり、バイト(8ビット) ASCIIを使用してバイト値をcharに変換し、文字列にcharを追加します。しかし、2時間以上のgoogeling後、運がないatm。私はリストをバイトリストに変換しようとしましたが、どちらもうまくいきません^^。誰もがStringに&デコードブールリストをコーディングする方法について、より良い提案を持っている場合リストを変換する<boolean>を文字列に

String strbyte = null; 
for (int x = 0; x != tmpboolist.Count; x++) //tmpboolist is the 90+- boolean list 
{ 
    //this loop checks for true then puts a 1 or a 0 in the string(strbyte) 
    if (tmpboolist[x]) 
    { 
     strbyte = strbyte + '1'; 
    } 
    else 
    { 
     strbyte = strbyte + '0'; 
    } 
} 

//here I try to convert the string to a byte list but no success 
//no success because the testbytearray has the SAME size as the 
//tmpboolist(but it should have less since 8 booleans should be 1 Byte) 
//however all the 'Bytes' are 48 & 49 (which is 1 and 0 according to 
//http://www.asciitable.com/) 
Byte[] testbytearray = Encoding.Default.GetBytes(strbyte); 

PS? (私はブールリストを文字列で、1と90のリストではなく文字列で共有したいからです)

EDIT:今すぐ動作しました! TY

string text = new string(tmpboolist.Select(x => x ? '1' : '0').ToArray()); 
byte[] bytes = getBitwiseByteArray(text); //http://stackoverflow.com/a/6756231/1184013 
String Arraycode = Convert.ToBase64String(bytes); 
System.Windows.MessageBox.Show(Arraycode); 
//first it makes a string out of the boolean list then it uses the converter to make it an Byte[](array), then we use the base64 encoding to make the byte[] a String.(that can be decoded later) 

を支援するためのすべての私は、後に、すべてのヘルプのためのTY再びencoding32に見えるでしょう:)、それはそのようなループ内で文字列を連結するには悪いアイデアだと起動するには

+0

あなたがあなたの文字列が –

+0

のようにそれはあなたがで終わるしたいのか明確ではありません見てみたいかについて、より具体的にする必要があります。ビットのasciiエンコードで、ブール値に戻すことができる文字列ですか? – jlew

+1

'Encoding.Default.GetBytes'はあなたが思っていることをしません。この質問を参照してください:http://stackoverflow.com/questions/2989695/how-to-convert-a-string-of-bits-to-byte-array –

答えて

13

ブール値をBitArrayに保存する必要があります。

var values = new BitArray(92); 
values[0] = false; 
values[1] = true; 
values[2] = true; 
... 

次に、あなたがBase64文字列を変換することができ、

var result = Convert.ToBase64String(bytes); 

逆Base64文字列にバイト配列

var bytes = new byte[(values.Length + 7)/8]; 
values.CopyTo(bytes); 

とバイト配列にBitArrayを変換することができますバイト配列へ

var bytes2 = Convert.FromBase64String(result); 

とBitArray

var values2 = new BitArray(bytes2); 

Base64文字列へのバイト配列は、次のようになります。"Liwd7bRv6TMY2cNE"。これはおそらく、人々の間で分かち合うためには少し不安でしょう。 human-oriented base-32 encodingを見て:

これら[ベース32文字列]の

予想使用 はカット - アンドペースト、テキスト編集を含む(例えばHTML内のファイル)など キーボード、ペンと紙を経由して手動転写、 電話または無線でボーカルの転写を介して手動転写

なエンコーディングのための要望は以下のとおりです。

  • 最小化転写エラー - 例えば '0'と 'O'を混同する周知の問題
  • 他の構造に埋め込むことはよく知られています。検索エンジン、構造化されたか マークアップされたテキスト、ファイルシステム、コマンドシェル
  • 簡潔 - [文字列]は短いものよりも短いものです。
  • 人間工学 - 人間のユーザー(特に非技術者)は [strings]をできるだけ簡単かつ快適に見つけます。醜い[弦]は悪く見えます。
+0

乾杯、私はそれがアプリの中にインポートし、共有することができます(99%はコピー&ペーストされる)ことができるコードであり、彼らが持っているアイテムを見ることができるでしょう(真)または持っていない(偽)。 編集:サイズが大きくなる可能性があるので(リスト)、BitArrayに格納したくないので、リストを使用する方が簡単です。右:p? – Maximc

+0

ちょうどの場合:[.NET用のBase32Encoding実装](http://hemant-jangid.blogspot.com/2009/06/base32encoding-implementation-for-net.html) – dtb

+0

私はブールリストを使用しているので、最初の部分はdoesnしかし、残りはしますが、私はまだ私のtmpboollistをByte []に​​する方法を見つける必要があります。 – Maximc

1

- 少なくとも、 StringBuilderを使用するか、またはLINQでこのようなものを使用します。

string text = new string(tmpboolist.Select(x => x ? '1' : '0').ToArray()); 

しかしList<bool>に、あなたの文字列を変換するstringIEnumerable<char>を実装しているという事実を利用して、LINQと簡単です。

List<bool> values = text.Select(c => c == '1').ToList(); 

バイト配列がどこに届くのかはわかりませんが、should not try to represent arbitrary binary data in a string just using Encoding.GetStringです。それはそれが何であるかではありません。

あなたの文字列が使用するフォーマットを気にしない場合は、Base64を使用するとうまくいくでしょうが、ブール値をバイトにグループ化する場合は、区別する必要がある場合は追加情報が必要です"7値"と "8値、最初は偽です"などです。

+0

素敵な助けをありがとう、今私はループのためにもう必要はありません! :) – Maximc

1

は、私はあなたのコードからinferingておりますので、あなたはこれがオフだった警告についてどのように、内部リストのbool値onthe応じて、1または0のいずれかのn桁の文字列...

public override string ToString() 
{ 
    StringBuilder output = new StringBuilder(91); 
    foreach(bool item in this.tempboolist) 
    { 
     output.Append(item ? "1" : "0"); 
    } 
    return output.ToString(); 
} 

をしたいですカフのタイピング、私はまだコンパイラでこれを検証していない!

0

この機能は、あなたが欲しいものを行います。

public String convertBArrayToStr(bool[] input) 
    { 
     if (input == null) 
      return ""; 
     int length = input.Count(); 
     int byteArrayCount = (input.Count() - 1)/8 + 1; 
     var bytes = new char[byteArrayCount]; 

     for (int i = 0; i < length; i++) 
     { 
      var mappedIndex = (i - 1)/8; 
      bytes[mappedIndex] = (char)(2 * bytes[mappedIndex] +(input[i] == true ? 1 : 0)); 
     } 
     return new string(bytes); 
    } 
関連する問題