2011-11-12 32 views
5

Tôi đang cố chuyển đổi 3 byte thành số nguyên đã ký (Big-endian) trong C#.Chuyển đổi 3 byte thành số nguyên đã ký trong C#

Tôi đã cố gắng sử dụng phương pháp BitConverter.ToInt32, nhưng vấn đề của tôi là giá trị nên có byte lats.

Ai có thể đề xuất tôi làm cách nào tôi có thể thực hiện theo cách khác?

Tôi cũng cần chuyển đổi 5 (hoặc 6 hoặc 7) byte thành ký dài, có quy tắc chung nào về cách thực hiện không?

Cảm ơn trước vì đã được trợ giúp.

+1

Ký hiệu và độ lớn? Bổ sung của hai? – Ani

+0

Đó là trong bổ sung của hai –

Trả lời

8

Như một phương sách cuối cùng bạn luôn có thể thay đổi + thêm cho mình:

byte b1, b2, b3; 

int r = b1 << 16 | b2 << 8 | b3; 

Chỉ cần hoán đổi b1/b2/b3 cho đến khi bạn có kết quả mong muốn.

Suy nghĩ thứ hai, điều này sẽ không bao giờ tạo ra giá trị âm.
Bạn muốn kết quả nào khi MSB> = 0x80?


Phần 2, vũ phu mở rộng lực lượng dấu:

private static int Bytes2Int(byte b1, byte b2, byte b3) 
    { 
     int r = 0; 
     byte b0 = 0xff; 

     if ((b1 & 0x80) != 0) r |= b0 << 24; 
     r |= b1 << 16; 
     r |= b2 << 8; 
     r |= b3; 
     return r; 
    } 

Tôi đã thử nghiệm này với:

 byte[] bytes = BitConverter.GetBytes(p); 
     int r = Bytes2Int(bytes[2], bytes[1], bytes[0]); 
     Console.WriteLine("{0} == {1}", p, r); 

trong vài p.

+0

ok, nhưng tôi cần giá trị âm cũng –

+0

ok, cảm ơn bạn đã trợ giúp. Giải pháp cuối cùng của tôi hơi khác một chút, nhưng tôi cũng sử dụng cơ chế kiểm tra bit quan trọng nhất (b1 & 0x80) để xác định xem số có dương hay âm hay không. –

+0

@ vc.one, vâng, cảm ơn bạn đã chỉnh sửa. '+' Cũng cần '()': '(b1 << 16) + ...' –

4

Giá trị cuối cùng phải là 0 nếu giá trị này không được đặt cho số dương, 256 cho giá trị âm.

Để biết những gì bạn cần vượt qua trong, bạn có thể thử chuyển đổi nó theo cách khác:

var bytes = BitConverter.GetBytes(i); 
int x = BitConverter.ToInt32(bytes, 0); 
+0

thêm 0 là sai nếu số chuyển đổi có dấu trừ –

+0

@RafalSpacjer thay đổi nó –

0

Để thêm vào câu trả lời hiện có ở đây, có một chút của một hình ảnh xác thực trong đó Bitconverter.ToInt32() sẽ ném một ArgumentException nếu mảng nhỏ hơn sizseof(int) (4) byte về kích thước;

Mảng đích không đủ dài để sao chép tất cả các mục trong bộ sưu tập. Kiểm tra chỉ số mảng và độ dài.

Cho một mảng nhỏ hơn sizeof(int) (4) byte về kích thước, bạn có thể bù đắp cho phần đệm trái/phải như vậy;

phải pad

Kết quả trong dương Int32 số

int intByteSize = sizeof(int); 
byte[] padded = new byte[intByteSize]; 
Array.Copy(sourceBytes, 0, padded, 0, sourceBytes.Length); 
sourceBytes = padded; 

Left-pad

Kết quả trong Int32 số âm, giả định khác không có giá trị ở chỉ số byte sourceBytes.Length - 1.

int intByteSize = sizeof(int); 
byte[] padded = new byte[intByteSize]; 
Array.Copy(sourceBytes, 0, padded, intByteSize - sourceBytes.Length, sourceBytes.Length); 
sourceBytes = padded; 

Khi đã đệm, bạn có thể gọi một cách an toàn int myValue = BitConverter.ToInt32(sourceBytes, 0);.

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