Tôi hiện đang đọc tệp và muốn có thể chuyển đổi mảng byte thu được từ tệp thành một mảng ngắn.Chuyển mảng byte thành mảng ngắn trong C#
Tôi làm cách nào để thực hiện việc này?
Tôi hiện đang đọc tệp và muốn có thể chuyển đổi mảng byte thu được từ tệp thành một mảng ngắn.Chuyển mảng byte thành mảng ngắn trong C#
Tôi làm cách nào để thực hiện việc này?
Một khả năng được sử dụng Enumerable.Select
:
byte[] bytes;
var shorts = bytes.Select(b => (short)b).ToArray();
khác là sử dụng Array.ConvertAll
:
byte[] bytes;
var shorts = Array.ConvertAll(bytes, b => (short)b);
Đề xuất ban đầu của bạn (trước khi bạn thêm phần thứ hai sau này) là không hiệu quả –
Một tùy chọn khác sẽ là byte.Cast
Thực ra, điều này dẫn đến một InvalidCastException. Lời giải thích ngắn gọn là đoạn mã này ngầm làm cho một byte được đóng hộp được unboxed thành một đoạn ngắn không phải là một hoạt động unboxing hợp lệ. Để biết chi tiết, hãy xem http://stackoverflow.com/questions/445471/puzzling-enumerable-cast-invalidcastexception. – jason
short[] wordArray = Array.ConvertAll(byteArray, (b) => (short)b);
byte[] bytes;
var shorts = bytes.Select(n => System.Convert.ToInt16(n)).ToArray();
Điều đó cực kỳ không hiệu quả: Gọi convert.ToInt16() cho mọi phần tử, lưu trữ nó trong một danh sách tạm thời, và sau đó sao chép nó vào một mảng mới. –
có, nó không hiệu quả. Tôi nghĩ rằng đó là an toàn hơn, tho, sau đó đúc. –
An toàn hơn đúc? Một diễn viên của byte để ngắn luôn luôn hoạt động. Nó không bao giờ có thể ném một ngoại lệ –
Một shorthard là một hợp chất của hai byte. Nếu bạn đang viết tất cả các quần short vào tập tin như quần short thực sự thì những chuyển đổi đó là sai. Bạn phải sử dụng hai byte để có được giá trị ngắn đúng, sử dụng một cái gì đó như:
short s = (short)(bytes[0] | (bytes[1] << 8))
short value = BitConverter.ToInt16(bytes, index);
Sử dụng Buffer.BlockCopy.
Tạo mảng ngắn chỉ bằng nửa kích thước của mảng byte, và sao chép dữ liệu byte trong:
short[] sdata = new short[(int)Math.Ceiling(data.Length/2)];
Buffer.BlockCopy(data, 0, sdata, 0, data.Length);
Đây là phương pháp nhanh nhất cho đến nay.
Giải pháp tôi không xứng đáng, nhưng tôi cần ngay bây giờ! – DaMachk
Tôi không biết, nhưng tôi đã có thể mong đợi một aproach cho câu hỏi này. Khi chuyển đổi một chuỗi các byte vào một chuỗi các quần short, tôi sẽ có nó được thực hiện như @ Peter đã làm
short s = (short)(bytes[0] | (bytes[1] << 8))
hoặc
short s = (short)((bytes[0] << 8) | bytes[1])
tùy thuộc vào endianess của các byte trong file.
Nhưng OP không đề cập đến việc sử dụng quần short hoặc định nghĩa quần short trong tệp. Trong trường hợp của mình, sẽ không có ý nghĩa gì khi chuyển đổi mảng byte thành một mảng ngắn, vì nó sẽ mất gấp đôi bộ nhớ, và tôi nghi ngờ nếu một byte cần được chuyển đổi thành một đoạn ngắn khi được sử dụng ở nơi khác.
Bạn có muốn chuyển đổi 1 byte thành 1 ngắn hoặc 2 byte thành 1 ngắn không? – maxwellb