2010-04-17 38 views
10

Tôi có một điều khiển có một mảng byte trong đó.Chuyển đổi 2 byte thành một số

Hiện tại, có hai byte cho tôi biết một số thông tin về số lượng các mục trong tương lai trong mảng.

Vì vậy, như một ví dụ tôi có thể có:

 
... 
... 
Item [4] = 7 
Item [5] = 0 
... 
...

Giá trị của điều này rõ ràng là 7.

Nhưng những gì về điều này?

 
... 
... 
Item [4] = 0 
Item [5] = 7 
... 
...

Bất kỳ ý tưởng nào về điều đó tương đương với (int bình thường)?

Tôi đã đi đến nhị phân và nghĩ rằng nó có thể là 11100000000 bằng 1792. Nhưng tôi không biết nếu đó là cách nó thực sự hoạt động (tức là nó sử dụng toàn bộ 8 mục cho byte).

Có cách nào để biết điều này với thử nghiệm không?

Lưu ý: Tôi đang sử dụng C# 3.0 và studio trực quan 2008

+4

Có vẻ như bạn đang yêu cầu chúng tôi thiết kế lại một số dữ liệu được tuần tự hóa. Điều đó sẽ phức tạp. Bạn có thể ít nhất đăng một số ví dụ về mảng byte hoàn chỉnh và những gì nó tương ứng với ba hoặc bốn ví dụ đơn giản. Nhưng tại sao bạn vẫn muốn biết điều này? Bạn đang cố giải quyết vấn đề gì? –

+0

Tôi đang cố giải mã mảng byte được trả về bằng điều khiển Chữ ký trong điều khiển OpenNETCF để tôi có thể xoay 180 độ. Xem câu hỏi này http://stackoverflow.com/questions/2657388/opennetcf-signature-control-question để biết thêm chi tiết. – Vaccano

Trả lời

19

BitConverter có thể dễ dàng chuyển đổi hai byte trong một giá trị số nguyên hai byte:

// assumes byte[] Item = someObject.GetBytes(): 
short num = BitConverter.ToInt16(Item, 4); // makes a short 
    // out of Item[4] and Item[5] 
+1

@Macho Matt: nếu bạn muốn nhận xét về câu trả lời đã được chấp nhận, tốt hơn là để lại nhận xét hơn là chỉnh sửa Ngoài ra, quan điểm của bạn không hoàn toàn chính xác - không quan trọng liệu hệ thống máy tính có lớn hay nhỏ, nó chỉ quan trọng nếu hệ thống ban đầu tạo mảng byte có độ tin cậy khác so với hệ thống chạy mã .NET ở đây – MusiGenesis

+0

Giả định rằng MSB của biểu diễn nhị phân của hai byte đó là bit dấu (1 = -ve, 0 = + ve) .Nếu không phải như vậy, nghĩa là nếu số không được ký , sau đó bạn cần phải sử dụng điều này ushort num = BitConverter.ToUInt16 (Item, 4). Cũng nên nhớ rằng sẽ có byte ở chỉ số 5 là byte đầu tiên (byte quan trọng nhất) nếu kiến ​​trúc của bạn là ít endian. Đọc reinventingthewheel .azurewebsites.net/TwosComplementTut.aspx cho mo thông tin về bit dấu. –

11

Số hai byte có byte thấp và cao. Các byte cao là giá trị 256 lần so với các byte thấp:

value = 256 * high + low; 

Vì vậy, đối cao = 0 và thấp = 7, giá trị là 7. Nhưng đối cao = 7 và thấp = 0, giá trị trở thành 1792.

Điều này tất nhiên giả định rằng số là một số nguyên 16 bit đơn giản. Nếu nó là bất cứ điều gì fancier, ở trên sẽ không đủ. Sau đó, bạn cần thêm kiến ​​thức về cách số được mã hóa, để giải mã nó.

Thứ tự byte cao và thấp xuất hiện được xác định bởi endianness của luồng byte. Trong phần lớn người lớn, bạn sẽ thấy cao trước khi thấp (ở địa chỉ thấp hơn), ở vị trí nhỏ, đó là cách khác.

+9

Cũng đáng chú ý: '(cao << 8) | low' – GeReV

0

Nếu các byte đó là "phần" của một số nguyên, nó hoạt động như thế. Nhưng hãy cẩn thận, rằng thứ tự byte là nền tảng cụ thể và nó cũng phụ thuộc vào độ dài của số nguyên (16 bit = 2 byte, 32 bit = 4bytes, ...)

0

Sử dụng BitConveter.ToInt32 im không 100% chắc chắn rằng sẽ cung cấp cho bạn kết quả phù hợp nhưng bạn có thể thử

7

Bạn nói "giá trị này rõ ràng là 7", nhưng nó hoàn toàn phụ thuộc vào mã hóa. Nếu chúng ta giả định byte có độ rộng đầy đủ, thì trong phần nhỏ, có; 7, 0 là 7. Nhưng ở endian lớn nó không phải là.

Đối với ít về cuối nhỏ, những gì bạn muốn là

int i = byte[i] | (byte[i+1] << 8); 

và lớn-endian:

int i = (byte[i] << 8) | byte[i+1]; 

Nhưng chương trình mã hóa khác có sẵn; ví dụ, một số lược đồ sử dụng số học 7 bit, với bit thứ 8 là bit tiếp tục. Một số lược đồ (UTF-8) đặt tất cả các bit tiếp tục trong byte đầu tiên (vì vậy đầu tiên chỉ có một số lượng hạn chế cho các bit dữ liệu) và 8 bit cho phần còn lại trong chuỗi.

+0

Điểm tốt. Nhưng từ việc sử dụng tôi có thể thấy rằng giá trị là 7 (có bảy phần tọa độ trong mảng. – Vaccano

2

Nếu bạn đơn giản chỉ muốn đưa hai byte cạnh nhau ở định dạng nhị phân, và xem những gì mà số lớn là trong hệ thập phân, sau đó bạn cần phải sử dụng mã này:

  if (BitConverter.IsLittleEndian) 
      { 
       byte[] tempByteArray = new byte[2] { Item[5], Item[4] }; 
       ushort num = BitConverter.ToUInt16(tempByteArray, 0); 
      } 
      else 
      { 
       ushort num = BitConverter.ToUInt16(Item, 4); 
      } 

Nếu bạn sử dụng short num = BitConverter.ToInt16(Item, 4); như đã thấy trong các câu trả lời được chấp nhận, bạn đang giả định rằng các bit đầu tiên của hai byte là bit dấu (1 = tiêu cực và 0 = dương). Câu trả lời đó cũng giả định rằng bạn đang sử dụng một hệ thống cuối lớn. Xem this để biết thêm thông tin về bit dấu.

0

Trong trường hợp mục mà [5] là MSB

  1. kết quả ushort = BitConverter.ToUInt16 (byte mới [2] {mục [5], khoản [4]}, 0);

  2. kết quả int = 256 * Mục [5] + Mục [4];

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