2015-05-28 14 views
9

OK, tôi đã xem qua một số bài viết herehere, nhưng họ không làm những gì tôi cần làm, và tôi ' m chạy vào một số rắc rối.MemoryStream to String và quay lại MemoryStream mà không cần thêm bất kỳ byte nào (mã hóa, v.v.)

Tôi nhận được một mảnh mã hóa dữ liệu như một MemoryStream. Tôi cần bằng cách nào đó ghi bộ nhớ vào một tập tin (cách tôi viết mockup, như một chuỗi sẽ là tốt nhất), sau đó lấy chuỗi từ tệp và gửi nó, như một bộ nhớ, đến một dịch vụ được giải mã. Tôi đã chỉ sử dụng một streamreader để lưu trữ các bộ nhớ như là một chuỗi, và đã đọc chuỗi vào bộ nhớ bằng cách sử dụng một mã hóa.

Vấn đề là tôi đã nhận một lỗi nói rằng dữ liệu được mã hóa của tôi đã bị hỏng. Tôi nghĩ điều này có nghĩa là tôi đã thay đổi byte, bằng cách nào đó.

Đây là mã đọc MemoryStream vào một chuỗi:

using (StreamReader reader = new StreamReader(dataKeyResponse.CiphertextBlob)) 
{ 
    encryptedDataKey = reader.ReadToEnd(); 
} 

Và đây là đoạn code đọc chuỗi, lấy ra từ tập tin, vào một MemoryStream:

MemoryStream mStream = new MemoryStream(ASCIIEncoding.Default.GetBytes(encryptedKey)); 

Tôi nghĩ bước đã làm nó đã được ASCIIEncoding, nhưng sau đó tôi thực hiện the workaround from above, chuyển đổi mảng byte vào một bộ nhớ, và có cùng một lỗi.

byte[] bytes = new byte[encryptedKey.Length*sizeof (char)]; 
System.Buffer.BlockCopy(encryptedKey.ToCharArray(), 0, bytes, 0, bytes.Length); 

string decryptedKey; 
using (MemoryStream mStream = new MemoryStream()) 
{ 
    mStream.Write(bytes, 0, bytes.Length); 
    var decryptRequest = new DecryptRequest() 
    {CiphertextBlob = mStream}; 
    var decryptResponse = client.Decrypt(decryptRequest); 
    using (StreamReader reader = new StreamReader(decryptResponse.Plaintext)) 
    { 
     decryptedKey = reader.ReadToEnd(); 
    } 
} 

Tôi giả sử (1) có điều gì đó thay đổi dữ liệu bằng cách nào đó và không phải một số lỗi khác; (2) rằng nó đang ở trong dòng -> chuỗi hoặc chuỗi -> quá trình chuyển đổi luồng và không phải chuỗi -> tệp hoặc chuỗi < - chuyển đổi tệp; và (3) rằng một bản sao hoàn hảo của dữ liệu đến và đi ra ngoài sẽ khắc phục được sự cố - dữ liệu đến được cho là phiên bản được mã hóa "nguyên bản"; có lẽ có một kỳ vọng rằng tôi mã hóa các dòng đến và đi ra ngoài (không mã hóa thậm chí thay đổi dữ liệu? Tôi đang đánh giá từ post rằng nó không).

Hoặc xác nhận rằng các byte phải tương đương đi vào và ra ngoài, hoặc một cách để nắm bắt bộ nhớ trong một tệp và gửi lại mà không thay đổi bất kỳ thứ gì tuyệt vời.

+4

Không lưu dữ liệu nhị phân (không phải văn bản) dưới dạng chuỗi. Không có vấn đề gì. Chỉ cần xử lý như một dòng byte. – Blorgbeard

+0

Dưới đây là làm thế nào để lưu/tải một MemoryStream: http://stackoverflow.com/questions/8624071/save-and-load-memorystream-to-from-a-file – Blorgbeard

+0

Bạn không thể lưu trữ byte tùy ý như dây đàn vì [dây có quy tắc ] (http://en.wikipedia.org/wiki/UTF-8#Invalid_byte_sequences) và byte tùy ý thì không. Bạn phải mã hóa byte bằng cách nào đó (ví dụ: Base64) hoặc lưu trữ byte thô, không phải chuỗi. –

Trả lời

8

Giả sử rằng MemoryStream chứa dữ liệu đầu vào sau: [0x01, 0x02, 0x03, 0x04] Khi bạn đọc nó với trình tạo luồng, biểu diễn nhị phân của chuỗi của bạn sẽ là: [0x00, 0x01, 0x00, 0x02 , 0x00, 0x03, 0x00, 0x04], bởi vì chuỗi sử dụng hai byte đại diện cho một ký tự. Những gì bạn làm sau đó là bạn phân bổ 8 byte cho biến "byte" của bạn thay vì 4, và điền nó với dữ liệu thứ hai (sửa đổi). Bạn có thể sử dụng Convert.ToBase64String() để có được một chuỗi đại diện, bạn cũng có thể sử dụng FromBase64String() để phân tích nó trở lại. Một cái gì đó như thế này:

var testData = new byte[] { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08 }; 
var inputStream = new MemoryStream(testData); 

var inputAsString = Convert.ToBase64String(inputStream.ToArray()); 
Console.WriteLine(inputAsString); 

var outputStream = new MemoryStream(Convert.FromBase64String(inputAsString)); 

var result = BitConverter.ToString(outputStream.ToArray());   
Console.WriteLine(result); 
Các vấn đề liên quan