2011-08-23 37 views
8

Tôi có thông số kỹ thuật đọc hai byte tiếp theo được ký int.cách đọc int đã ký từ byte trong java?

Để đọc rằng trong java tôi đã sau

Khi tôi đọc một int đăng nhập java sử dụng đoạn mã sau tôi nhận được một giá trị của 65449

logic để tính unsigned

int a =(byte[1] & 0xff) <<8 

int b =(byte[0] & 0xff) <<0 

int c = a+b 

Tôi tin rằng điều này là sai bởi vì nếu tôi và với 0xff tôi nhận được một số không tương đương

vì vậy tôi đã xóa & 0xff và logic như được đưa ra bên dưới

int a = byte[1] <<8 
int b = byte[0] << 0 
int c = a+b 
which gives me the value -343 
byte[1] =-1 
byte[0]=-87 

Tôi đã cố gắng bù đắp các giá trị này theo cách thông số đọc nhưng điều này có vẻ sai.Khi kích thước của heap không rơi xuống dưới mức này.

Cách nào phù hợp để tính toán int đã ký trong java?

Sau đây là cách spec đi

somespec() { xtype 8 uint8 xStyle 16 int16 } xStyle: Một số nguyên ký đại diện cho một cơ cấu bù đắp (theo byte) từ khi bắt đầu Widget này() để bắt đầu một cấu trúc xStyle() mà diễn tả được thừa kế các kiểu được xác định bởi tiện ích con trang cũng như các kiểu áp dụng cụ thể cho tiện ích con này.

+0

Bạn có thể hiển thị ví dụ về đầu vào và kết quả mong muốn không? nó không rõ ràng .. – MByD

+0

tôi đọc điều này từ một luồng bằng cách sử dụng một đặc điểm kỹ thuật. Tôi đọc hai byte theo spec và các giá trị khi tôi đọc trong một mảng byte khi chuyển đổi thành các byte riêng lẻ là byte [1] = - 1 và byte [0] = - 87 nói trong một mảng byte chứa hai byte. Đặc tả này đánh dấu hai byte này là int int và tôi không biết đầu ra chính xác là gì. – Siva

Trả lời

13

Nếu bạn đánh giá là một ký 16-bit bạn muốn có một short và int là 32-bit, trong đó cũng có thể giữ các giá trị tương tự, nhưng không phải như vậy một cách tự nhiên.

Dường như bạn muốn có một giá trị nhỏ 16 bit đã ký.

byte[] bytes = 
short s = ByteBuffer.wrap(bytes).order(ByteOrder.LITTLE_ENDIAN).getShort(); 

hoặc

short s = (short) ((bytes[0] & 0xff) | (bytes[1] << 8)); 

BTW: Bạn có thể sử dụng một int nhưng nó không đơn giản như vậy.

// to get a sign extension. 
int i = ((bytes[0] & 0xff) | (bytes[1] << 8)) <<16>> 16; 

hoặc

int i = (bytes[0] & 0xff) | (short) (bytes[1] << 8)); 
+0

hoạt động này. cảm ơn – Siva

2

Tôi không thể biên dịch ngay bây giờ, nhưng tôi sẽ làm (giả sử byte1byte0 là realling của loại byte).

int result = byte1; 
result = result << 8; 
result = result | byte0; //(binary OR) 
if (result & 0x8000 == 0x8000) { //sign extension 
    result = result | 0xFFFF0000; 
} 

nếu byte1byte0 được ints, bạn sẽ cần phải thực hiện '& 0xFF

UPDATE bởi vì Java buộc sự biểu hiện của một nếu là một boolean

+0

nếu tôi làm điều này tôi nhận được một bù đắp -87, tôi sẽ cố gắng này và xem nếu tôi có thể đọc giá trị trong heap.Also bạn có thể xin vui lòng giúp tôi xác minh nếu điều này như thế nào tôi nên đọc spec này somespec() { xtype 8 uint8 xStyle 16 int16} xStyle: Một số nguyên đã ký đại diện cho một offset (tính bằng byte) từ đầu của cấu trúc Widget() này đến đầu của một cấu trúc xStyle() thể hiện các kiểu được thừa hưởng cho được xác định bởi widget trang cũng như các kiểu áp dụng cụ thể cho tiện ích con này. – Siva

2

Hãy xem trên DataInputStream.readInt(). Bạn có thể hoặc mã thép từ đó hoặc chỉ sử dụng DataInputStream: bọc luồng đầu vào của bạn với nó và sau đó đọc dữ liệu đã nhập một cách dễ dàng.

Để tiện cho bạn đây là đoạn code:

public final int readInt() throws IOException { 
    int ch1 = in.read(); 
    int ch2 = in.read(); 
    int ch3 = in.read(); 
    int ch4 = in.read(); 
    if ((ch1 | ch2 | ch3 | ch4) < 0) 
     throw new EOFException(); 
    return ((ch1 << 24) + (ch2 << 16) + (ch3 << 8) + (ch4 << 0)); 
} 
+1

Điều này đọc một giá trị 32-bit lớn-endian, tôi tin rằng OP muốn một chút giá trị cuối 16-bit. –

4

Giả sử rằng byte [1] là MSB, và byte [0] là LSB, và rằng bạn muốn câu trả lời là một 16 bit đã ký số nguyên:

short res16 = ((bytes[1] << 8) | bytes[0]); 

Sau đó, để có được một 32 bit đã ký số nguyên:

int res32 = res16; // sign extends. 

Nhân tiện, đặc điểm kỹ thuật nên nói hai byte là MSB, và đó là LSB. Nếu nó không và nếu không có bất kỳ ví dụ, bạn không thể thực hiện nó!


Một nơi nào đó trong thông số, nó sẽ cho biết cách biểu diễn "int16". Dán phần THAT. Hoặc dán liên kết đến thông số để chúng tôi có thể tự đọc.

+0

vui lòng xem các chỉnh sửa của tôi trong truy vấn chính, tôi đã đưa ra thông số như thế nào – Siva

1

bạn có cách tìm đầu ra chính xác cho đầu vào đã cho không? về mặt kỹ thuật, kích thước int là 4 byte, vì vậy chỉ với 2 byte, bạn không thể truy cập bit dấu.

+0

somespec() { xtype 8 uint8 pwStyle 16 int16} Một số nguyên được ký hiệu đại diện cho độ lệch (tính theo byte) từ đầu Widget này () cấu trúc để bắt đầu một cấu trúc xStyle() thể hiện các kiểu được kế thừa do tiện ích trang xác định là cũng như các kiểu áp dụng cụ thể cho tiện ích con này. – Siva

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