2012-02-10 53 views
6

Tôi có danh sách boolean với 92 boolean, tôi muốn danh sách được chuyển đổi thành chuỗi, tôi nghĩ mình sẽ lấy 8 booleans (bit) và đặt chúng trong Byte (8 bit) và sau đó sử dụng ASCII để chuyển đổi nó thành giá trị byte thành char rồi thêm các ký tự vào một chuỗi. Tuy nhiên sau khi googeling cho hơn sau đó 2 giờ, không may mắn atm. Tôi đã thử chuyển đổi danh sách thành một danh sách Byte nhưng nó không hoạt động hoặc là ^^.Danh sách chuyển đổi <boolean> thành chuỗi

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 Nếu có ai có đề xuất tốt hơn về cách mã & giải mã danh sách Boolean thành chuỗi? (Vì tôi muốn mọi người chia sẻ danh sách boolean của họ với một chuỗi thay vì danh sách 90 1 và 0.)

EDIT: đã làm việc ngay bây giờ! ty tất cả vì đã giúp

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) 

tôi sẽ nhìn vào encoding32 sau, ty cho tất cả sự giúp đỡ một lần nữa :)

+0

bạn cần phải cụ thể hơn về những gì bạn muốn chuỗi của bạn trông giống như –

+0

Nó không rõ ràng những gì bạn muốn kết thúc với. Một chuỗi là mã hóa ascii của các bit, sau đó có thể được chuyển trở lại thành các boolean? – jlew

+1

'Encoding.Default.GetBytes' không làm những gì bạn nghĩ. Xem câu hỏi này: http://stackoverflow.com/questions/2989695/how-to-convert-a-string-of-bits-to-byte-array –

Trả lời

13

Bạn nên lưu trữ các giá trị boolean của mình trong một BitArray.

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

Sau đó, bạn có thể chuyển đổi các BitArray đến một mảng byte

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

và mảng byte thành một chuỗi Base64

var result = Convert.ToBase64String(bytes); 

reversely, bạn có thể chuyển đổi một chuỗi Base64 thành mảng byte

var bytes2 = Convert.FromBase64String(result); 

và mảng byte để một BitArray

var values2 = new BitArray(bytes2); 

Chuỗi Base64 trông như thế này: "Liwd7bRv6TMY2cNE". Đây có lẽ là một chút không hài lòng khi chia sẻ giữa mọi người; có một cái nhìn tại human-oriented base-32 encoding:

sử dụng được mong đợi của những [cơ sở-32 strings] bao gồm đồ cắt và-dán, chỉnh sửa văn bản (ví dụtrong HTML files), thủ công sao chép qua một bàn phím, sao chép tự điều chỉnh qua bút và giấy, sao chép vocal trên điện thoại hoặc radio, vv

Các ước nguyện cho một mã hóa đó là:

  • giảm thiểu lỗi phiên mã - ví dụ vấn đề nổi tiếng gây nhầm lẫn '0' với 'O'
  • nhúng vào các cấu trúc khác - ví dụ: các công cụ tìm kiếm, có cấu trúc hoặc văn bản được đánh dấu, hệ thống tệp, vỏ lệnh
  • ngắn gọn - Các chuỗi ngắn hơn sẽ tốt hơn các chuỗi dài hơn.
  • thái - Người dùng của con người (đặc biệt là những người không phải kỹ thuật) nên tìm thấy [chuỗi] dễ dàng và dễ chịu nhất có thể. Các xấu hơn các [dây] trông, tồi tệ hơn.
+0

Chúc mừng, tôi không quan tâm nó là cơ sở 64 tôi nghĩ, Đó là mã mà ppl có thể chia sẻ (99% sẽ được sao chép và dán) sau đó nhập vào ứng dụng và họ sẽ có thể xem những mục họ có (đúng) hoặc không có (sai). Chỉnh sửa: Tôi không muốn lưu trữ nó trong một BitArray vì nó có thể phát triển (danh sách) để kích thước có thể tăng, Vì vậy, nó dễ dàng hơn để sử dụng một Danh sách . Quyền: p? – Maximc

+0

Chỉ trong trường hợp: [Base32Encoding Implementation For .NET] (http://hemant-jangid.blogspot.com/2009/06/base32encoding-implementation-for-net.html) – dtb

+0

Tôi sử dụng danh sách boolean để phần đầu tiên không t làm việc, tuy nhiên phần còn lại, nhưng tôi vẫn cần phải tìm cách để có được tmpboollist của tôi để Byte []. – Maximc

1

Để bắt đầu, đó là một ý tưởng tồi để nối chuỗi trong một vòng lặp như vậy - ít nhất sử dụng StringBuilder, hoặc sử dụng một cái gì đó như thế này với LINQ:

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

Nhưng chuyển đổi chuỗi của bạn đến một List<bool> rất dễ dàng với LINQ, sử dụng thực tế là string thực hiện IEnumerable<char>:

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

Không rõ vị trí của mảng byte ... nhưng bạn should not try to represent arbitrary binary data in a string just using Encoding.GetString. Đó không phải là những gì nó cho.

Nếu bạn không quan tâm định dạng chuỗi của bạn sử dụng, thì sử dụng Base64 sẽ hoạt động tốt - nhưng lưu ý rằng nếu bạn nhóm các giá trị Boolean thành byte, bạn sẽ cần thêm thông tin nếu cần phân biệt "7 giá trị" và "8 giá trị, giá trị đầu tiên trong số đó là False" chẳng hạn.

+0

Cảm ơn bạn đã giúp đỡ tốt đẹp, Bây giờ tôi không cần phải lặp lại nữa! :) – Maximc

1

Kể từ khi tôi đang infering từ mã của bạn, bạn muốn có một chuỗi với n chữ số 1 hoặc 0 tùy onthe danh sách giá trị bool nội bộ thì làm sao về ...

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

Cảnh báo này đã được tắt việc gõ dấu vân tay, tôi chưa xác nhận điều này với trình biên dịch!

0

Chức năng này làm những gì bạn muốn:

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); 
    } 
Các vấn đề liên quan