2009-07-09 42 views

Trả lời

14

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); 
+0

Đề 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ả –

+1

Một tùy chọn khác sẽ là byte.Cast () .ToArray(); –

+0

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

0
short[] wordArray = Array.ConvertAll(byteArray, (b) => (short)b); 
-2
byte[] bytes; 
var shorts = bytes.Select(n => System.Convert.ToInt16(n)).ToArray(); 
+0

Đ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. –

+0

có, nó không hiệu quả. Tôi nghĩ rằng đó là an toàn hơn, tho, sau đó đúc. –

+0

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ệ –

2

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)) 
+0

Điều này không hoạt động.Bạn phải làm như thế này để làm cho nó hoạt động: ngắn s = (ngắn) ((byte [0] << 8) | byte [1]); – DaveN59

+3

Giả sử một chút endian, điều này nên là: ngắn s = (ngắn) (byte [0] | (byte [1] << 8)) – Indy9000

2
short value = BitConverter.ToInt16(bytes, index); 
48

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.

+1

Giải pháp tôi không xứng đáng, nhưng tôi cần ngay bây giờ! – DaMachk

0

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.

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