2015-06-16 13 views
5

Tôi đang cố gắng tạo một List<byte> từ tệp có chứa chuỗi (Hệ thập lục phân). định nghĩa là:Thêm hệ thập lục phân từ tệp vào Danh sách <byte>

List<byte> myArray = new List<byte>(); 

nếu tôi muốn thêm thông tin của tôi trực tiếp tôi sử dụng một cái gì đó như thế này:

myArray.Add(0xb8); 

Lưu ý: Nếu không có bất kỳ báo giá hoặc ngoặc kép.

Vấn đề là khi tôi muốn làm điều tương tự từ tệp! Bây giờ tôi muốn biết những gì loại 0xb8 's là vì vậy tôi sử dụng đoạn mã sau:

0xc3.GetType().ToString() 

kết quả là: System.Int32 !!!!

nhưng khi tôi đọc chuỗi từ tệp và sử dụng mã như thế này, nó cho tôi lỗi sau.

mã:

Line = "0xb8"; 
myArray.Add(Convert.ToInt32(Line)); 

Lỗi:

Argument 1: cannot convert from 'int' to 'byte' 

và rõ ràng. vì quá tải chỉ myArray chỉ nhận được byte là lý do. Điều gì làm cho điều phức tạp đối với tôi là lý do tại sao nó không cho tôi bất kỳ lỗi nào khi tôi thêm một số Int32 đến myArray trong myArray.Add(0xb8);.

Tôi nghĩ rằng nó phải là một dạng byte! có lẽ !

Tại sao nó không đưa ra bất kỳ lỗi nào và cách hoàn thành kịch bản này (ý tôi là thêm byte từ chuỗi vào myArray)?

+0

'kết quả là: System.Int32 !!!! 'tất nhiên ... một số. Còn gì nữa? – edc65

Trả lời

2

Bạn có thể thoát khỏi rằng lỗi biên dịch bằng cách chỉ đúc các giá trị cho byte:

myArray.Add((byte)Convert.ToInt32(Line)); 

Tuy nhiên, khi bạn chạy mã mà bạn sẽ nhận được một lỗi khác nhau:

Unhandled Exception: System.FormatException: Input string was not in a correct format.

Đó là vì phương pháp Convert.ToInt32 không phân tích cú pháp số thập lục phân ra khỏi hộp.

Bạn có thể chỉ định các cơ sở khi bạn chuyển đổi chuỗi thành một số:

myArray.Add((byte)Convert.ToInt32(Line, 16)); 
+0

Hoặc bạn có thể tự mình lưu diễn viên và sử dụng 'Convert.ToByte (Line, 16)' thay vào đó ... sau đó nếu bạn tình cờ cung cấp một 'Line' của" 0xF8C4 ", bạn có thể bắt được' OverflowException' thay vì chỉ lặng lẽ cắt ngắn thành 0xC4 – Sabre

2

How can accomplish this scenario (I mean add byte from string to myArray) ?

List<byte> myArray = new List<byte>(); 
string Line = "0xb8"; 
myArray.Add(Convert.ToByte(Line, 16)); 

why it doesn't give me any error when I add a Int32 to myArray in myArray.Add(0xb8);

trình biên dịch có thể thấy rằng 0xb8 là trong Byte giá trị dao động

myArray.Add(0xb8); // ok 
myArray.Add(0xff); // ok 
myArray.Add(0x100); // cannot convert from int to byte 
4

0xb8 là một số nguyên chữ (như 1234). "0xb8" là một chuỗi chữ (như "x"). Không có thứ gì như một chữ hex trong C#. Đó là một chữ int trong định dạng hex. Vì vậy, giải thích những rắc rối bạn đã có với các literals.

Không phải tất cả các chức năng phân tích cú pháp chuỗi đều hỗ trợ đầu vào hex. Xem this for how to parse a hex string.

Khi chức năng phân tích cú pháp cung cấp cho bạn int và bạn cần xem nó là byte, bạn có thể truyền: (byte)myInt. Điều này là an toàn vì giá trị được phân tích cú pháp được đảm bảo để vừa với một byte.

Ở một số nơi, trình biên dịch có thể tự động chuyển đổi cho bạn nếu bạn đã sử dụng hằng số như 0xb8. Vì bạn sẽ không có điều đó trong thực tế (bạn đang phân tích một tệp) trường hợp đó không liên quan đến mã cuối cùng. Nhưng điều này giải thích tại sao nó hoạt động.

+1

vấn đề của mình là có một số thông minh trong trình biên dịch để các chữ số nguyên được chuyển đổi sang đúng loại bởi trình biên dịch ... – xanatos

+0

@xanatos đúng. * Nhiều thứ * để giải thích ở đây! Thật là một vấn đề gây nhầm lẫn đáng ngạc nhiên cho người mới bắt đầu. – usr

5

này hoạt động:

var list = new List<byte>(); 

byte byteValue = 0xb8; 
list.Add(byteValue); 

này không ("không thể chuyển đổi từ 'int' thành 'byte'"):

var list = new List<byte>(); 

int byteValue = 0xb8; 
list.Add(byteValue); 

Tuy nhiên, trong cả hai trường hợp 0xb8 được công nhận là System.Int32. Vậy tại sao trình biên dịch cho phép chuyển đổi ẩn của một số int thành byte trong ví dụ đầu tiên?

Xem C# đặc tả 6.1.9 Implicit liên tục chuyển đổi biểu thức:

A constant-expression (§7.19 [including literals]) of type int can be converted to type sbyte, byte, short, ushort, uint, or ulong, provided the value of the constant-expression is within the range of the destination type.

này tồn tại vì tất cả các chữ số nguyên là một trong hai (u)int hoặc (u)long, theo quy định tại 2.4.4.2 literals Integer.

Cho 0 <= 0xb8 <= 255, trình biên dịch cho phép chuyển đổi ẩn.

Trong trường hợp của bạn, vì lý do explained by @usr, bạn sẽ cần phải làm một chuyển đổi rõ ràng:

myArray.Add((byte)Convert.ToInt32(Line, 16)); 
+2

vâng, cảm ơn bạn. bạn là đúng –

Các vấn đề liên quan