2009-02-12 36 views
6

Tại thời điểm này hầu hết mọi người sẽ nghĩ "Ah bài bệnh này ..:"C# chuyển đổi chuỗi thành byte của nó [] tương đương

byte[] dataB= System.Text.Encoding.ASCII.GetBytes(data); 

Tuy nhiên .. vấn đề tôi có là tôi cần những giá trị chính xác của các byte không có mã hóa chỉ là giá trị thuần túy cho mỗi byte. Ví dụ: nếu giá trị của chuỗi là (0xFF32) tôi cũng muốn nó chuyển đổi nó {255,50}. ông lý do cho điều này là tôi có một định dạng tập tin tôi đang cố gắng để đọc mà cửa hàng int như byte tiết kiệm cho họ và sau đó đọc chúng khi chương trình mở ra.

Đây là những gì tôi có cho đến nay:

... 
dialog.InitialDirectory = 
    Environment.GetFolderPath(System.Environment.SpecialFolder.Desktop) + 
    "/Test"; 

dialog.Title="Open File"; 

if (dialog.ShowDialog(this) == DialogResult.OK) 
{ 
    StreamReader reader = new StreamReader(dialog.FileName); 
    string data = reader.ReadToEnd(); 
    reader.Close(); 
    byte[] fileC = System.Text.Encoding.ASCII.GetBytes(data); 
    File_Read(dialog.FileName,fileC); 
} 
... 

Vì vậy, khi tôi cố gắng và đọc các tập tin nó chuyển đổi các tu tập của nói 0xFF vào 0x3F vì 0xFF là lớn hơn sau đó 127 và 0x3F là một?.

Xin lỗi nếu tôi có vẻ hơi khó hiểu :)

Cảm ơn, Michael

Trả lời

18

Vấn đề là với cách tiếp cận của bạn để bắt đầu với:

tôi cần những giá trị chính xác của các byte không có mã hóa

...

Ví dụ, nếu giá trị của chuỗi là (0xFF32)

Đó là một chút giống như nhìn vào một bức tranh sơn dầu và nói: "Tôi muốn các byte cho bức tranh đó, không có mã hóa." Nó không có ý nghĩa. Văn bản không giống với dữ liệu nhị phân. Một khi bạn hiểu điều đó, thật dễ dàng để đến gốc của vấn đề. Điều bạn thực sự muốn là nội dung của một tệp dưới dạng một mảng byte. Thật dễ dàng, bởi vì các tập tin là dữ liệu nhị phân! Bạn không nên đọc nó như là văn bản ở nơi đầu tiên nếu nó không thực sự là văn bản. May mắn thay, .NET làm cho điều này thực sự dễ dàng:

byte[] fileC = File.ReadAllBytes(dialog.FileName); 
+0

tôi hiểu cách thức các byte bit của tệp và tất cả hoạt động đó là lý do tại sao im có thể hiểu được lưu trữ (ví dụ) một số nguyên 64 bit dưới dạng 8 byte mà tôi không biết cách nhận tại thông tin :); thansk cho sự giúp đỡ của bạn – redorkulated

+1

Nhưng xử lý một tập tin như thể nó có chứa văn bản khi nó không phải là một sự hiểu lầm cơ bản mà bỏng * vì vậy * nhiều người. Bất cứ lúc nào bạn bắt đầu suy nghĩ về "nội dung của một chuỗi như byte mà không có một mã hóa" mà gần như chắc chắn có nghĩa là có một lỗi ẩn. –

+0

tôi đã không nhìn vào "chuỗi" như văn bản trong trường hợp này tôi đã cố gắng để chỉ nhận được nhị phân tinh khiết như thats những gì các tập tin được lưu trữ. Tôi hiểu điểm của bạn mặc dù vậy cảm ơn :) – redorkulated

12

Tuy nhiên .. vấn đề tôi có là tôi cần giá trị chính xác của các byte không mã hóa chỉ giá trị thuần túy cho mỗi byte.

Sau đó sử dụng này:

byte[] dataB = System.Text.Encoding.Unicode.GetBytes(data); 

Nó trả về byte như lưu trữ nội bộ của chuỗi NET.

Nhưng tất cả điều này là từ viết mã: Một chuỗi là luôn là được liên kết với một mã hóa cụ thể và không có cách nào xung quanh nó. Ở trên sẽ thất bại, ví dụ: nếu tệp chứa chuỗi mã Unicode không hợp lệ (có thể xảy ra) hoặc thông qua quá trình chuẩn hóa. Vì bạn rõ ràng không phải là muốn một string, không đọc một. Đọc tệp dưới dạng dữ liệu nhị phân để thay thế.

1

Nếu bạn muốn byte, hãy sử dụng Luồng!

Tại sao bạn đang làm rối tung một TextReader?

EDIT:

Ví dụ: bạn đang mở tệp, vì vậy chỉ cần sử dụng luồng tệp.

+1

hey, im thực sự mới để C# chỉ tìm thấy một ví dụ để đọc các tập tin và thats những gì tôi cobbled với nhau: P. Didnt biết rằng các tập tin có thể được đọc theo cách khác :) – redorkulated

3

Tại sao lại chuyển đổi từ chuỗi? Bạn có thể không chỉ đọc nội dung của tập tin trực tiếp vào byte?

byte[] fileC = File.ReadAllBytes(dialog.FileName); 
11

// chuyển đổi một chuỗi thành một mảng byte

public static byte[] StrToByteArray(string str) 
{ 
    System.Text.UTF8Encoding encoding=new System.Text.UTF8Encoding(); 
    return encoding.GetBytes(str); 
} 

// chuyển đổi một mảng byte thành một chuỗi

public string ByteArrayToStr(byte [] dBytes) 
{ 
System.Text.UTF8Encoding enc = new System.Text.UTF8Encoding(); 
return enc.GetString(dBytes); 
} 
Các vấn đề liên quan