2012-10-22 30 views
22

Mã của tôi trông như thế này:Tại sao tôi không thể đặt giá trị hex vào mảng byte trong java?

public byte s[] = { 
     0x63, 0x7C, 0x77, 0x7B, 0xF2, 0x6B, 0x6F, 0xC5, 0x30, 0x01, 0x67, 0x2B, 0xFE, 0xD7, 0xAB, 0x76, 
     0xCA, 0x82, 0xC9, 0x7D, 0xFA, 0x59, 0x47, 0xF0, 0xAD, 0xD4, 0xA2, 0xAF, 0x9C, 0xA4, 0x72, 0xC0, 
     0xB7, 0xFD, 0x93, 0x26, 0x36, 0x3F, 0xF7, 0xCC, 0x34, 0xA5, 0xE5, 0xF1, 0x71, 0xD8, 0x31, 0x15, 
     0x04, 0xC7, 0x23, 0xC3, 0x18, 0x96, 0x05, 0x9A, 0x07, 0x12, 0x80, 0xE2, 0xEB, 0x27, 0xB2, 0x75, 
     0x09, 0x83, 0x2C, 0x1A, 0x1B, 0x6E, 0x5A, 0xA0, 0x52, 0x3B, 0xD6, 0xB3, 0x29, 0xE3, 0x2F, 0x84, 
     0x53, 0xD1, 0x00, 0xED, 0x20, 0xFC, 0xB1, 0x5B, 0x6A, 0xCB, 0xBE, 0x39, 0x4A, 0x4C, 0x58, 0xCF, 
     0xD0, 0xEF, 0xAA, 0xFB, 0x43, 0x4D, 0x33, 0x85, 0x45, 0xF9, 0x02, 0x7F, 0x50, 0x3C, 0x9F, 0xA8, 
     0x51, 0xA3, 0x40, 0x8F, 0x92, 0x9D, 0x38, 0xF5, 0xBC, 0xB6, 0xDA, 0x21, 0x10, 0xFF, 0xF3, 0xD2, 
     0xCD, 0x0C, 0x13, 0xEC, 0x5F, 0x97, 0x44, 0x17, 0xC4, 0xA7, 0x7E, 0x3D, 0x64, 0x5D, 0x19, 0x73, 
     0x60, 0x81, 0x4F, 0xDC, 0x22, 0x2A, 0x90, 0x88, 0x46, 0xEE, 0xB8, 0x14, 0xDE, 0x5E, 0x0B, 0xDB, 
     0xE0, 0x32, 0x3A, 0x0A, 0x49, 0x06, 0x24, 0x5C, 0xC2, 0xD3, 0xAC, 0x62, 0x91, 0x95, 0xE4, 0x79, 
     0xE7, 0xC8, 0x37, 0x6D, 0x8D, 0xD5, 0x4E, 0xA9, 0x6C, 0x56, 0xF4, 0xEA, 0x65, 0x7A, 0xAE, 0x08, 
     0xBA, 0x78, 0x25, 0x2E, 0x1C, 0xA6, 0xB4, 0xC6, 0xE8, 0xDD, 0x74, 0x1F, 0x4B, 0xBD, 0x8B, 0x8A, 
     0x70, 0x3E, 0xB5, 0x66, 0x48, 0x03, 0xF6, 0x0E, 0x61, 0x35, 0x57, 0xB9, 0x86, 0xC1, 0x1D, 0x9E, 
     0xE1, 0xF8, 0x98, 0x11, 0x69, 0xD9, 0x8E, 0x94, 0x9B, 0x1E, 0x87, 0xE9, 0xCE, 0x55, 0x28, 0xDF, 
     0x8C, 0xA1, 0x89, 0x0D, 0xBF, 0xE6, 0x42, 0x68, 0x41, 0x99, 0x2D, 0x0F, 0xB0, 0x54, 0xBB, 0x16 
    }; 

Netbeans nói với tôi:

thể mất độ chính xác - cần byte, tìm thấy int

Tôi đang làm gì sai? Nếu tôi sử dụng một đoạn ngắn thay vì int nó hoạt động chính xác.

Trả lời

31

Byte là kiểu dữ liệu được ký trong Java. Nó có thể lấy giá trị từ -128 (-0x80) đến 127 (0x7f). Một số hằng số của bạn sẽ không phù hợp trong phạm vi này và không, do đó, hợp lệ byte 's. Không giống như C++, nơi BYTE thường được định nghĩa là unsigned char. Ngoài ra, Java là chặt chẽ hơn về chuyển đổi datatype với sự mất chính xác.

Vì vậy, 0xF2 không hợp lệ byte chữ. Đó là shortintlong hợp lệ. Java sử dụng khái niệm điên rồ của các ký tự hex âm cho các giá trị như vậy. Chữ thập lục phân âm cho 0xF2 sẽ là -0x0e.

Tùy thuộc vào trường hợp của bạn, sử dụng kiểu dữ liệu lớn hơn hoặc sử dụng chuyển đổi nội tuyến (như (byte)0xF2) hoặc sử dụng một cái gì đó như Excel để chuyển đổi các giá trị 0x80 và nhiều hơn nữa thành biểu diễn hex âm.

+10

Đó là giá trị chỉ ra rằng đúc một int đó là giữa '0x80' và' 0xFF' đến một byte thường sẽ cung cấp cho bạn byte âm mà bạn "muốn".Nghĩa là, mẫu bit không bị thay đổi bởi dàn diễn viên, chỉ cắt ngắn và trừ khi bạn cần thực hiện các phép tính trên byte, mọi thứ sẽ hoạt động như mong đợi và chuyển đổi lên phía trước không thực sự cần thiết. – millimoose

+0

tôi cần phải thực hiện một số thao tác với giá trị này –

+0

Sau đó, hãy tạo một mảng 'ngắn'. –

9

Byte trong Java (như tất cả các loại số nguyên thủy) là đã ký.

Phạm vi hợp lệ của các giá trị byte là -128 đến 127.

Vì vậy, không có byte có giá trị tương tự như các nguyên 0xFF = 255, nhưng bạn cần một dàn diễn viên, đó là những gì trình biên dịch của bạn là cảnh báo bạn về. Lưu ý rằng 255 sẽ thực sự trở thành -1.

Hãy thử đoạn mã sau mình:

byte test = (byte) 0xFF; 
System.out.println(test == 0xFFFFFFFF); // True: -1 == -1 (as int) 
System.out.println((byte)0xFF == 0xFFFFFFFF); // True: -1 == -1 (as int) 
System.out.println(0xFF == (byte) 0xFFFFFFFF); // False: +255 != -1 (as int) 
System.out.println((byte)0xFF == (byte) 0xFFFFFFFF); // True: -1 == -1 (as byte) 
byte warn = (byte) 0xFF; // "error: possible loss of precision" unless cast 
byte nowarn = -0x1; // No error. -0x1 is a *valid* byte in Java! 
System.out.println(warn == nowarn); // True: -1 == -1 (as bytes) 
System.out.println((int)warn == (int)nowarn); // True: -1 == -1 (as int, too) 

này nên in true, true, false, true, true, true như đã nêu.

Bạn phải nhận ra rằng == khi áp dụng cho byte == int, chuyển đổi (đã ký) byte một (đã ký) số nguyên, và byte -1 nên dĩ nhiên trở thành int -1.

+0

và nếu tôi làm các hoạt động với các giá trị này tôi sẽ nhận được kết quả tương tự? –

+0

Các hoạt động có khả năng sẽ truyền lên số nguyên này, vì vậy '(int) ((byte) 0xFF) == 0xFFFFFFFF'. Tôi sẽ cập nhật trả lời của tôi. –

3

Thay vào đó, trong Java 7 bạn viết các byte byte theo ký hiệu nhị phân. ví dụ. 0b101 là 5.

+10

Và chính xác điều này giúp gì ở đây? –

0

Thay vì tham gia 0xFF chúng ta có thể sử dụng 0X7F và theo dõi các mã như dưới đây

byte[] ba = new byte[charArray.length*2]; 
int j = 0; 
byte mask = (byte) 0x7f; 
System.out.println("mask value is:" + mask); 

for (int i = 0; i < charArray.length; ++i, j+=2) { 
    byte upper8bits = (byte) ((byte)(charArray[i] >> (1<<3)) & mask); 
    byte lower8bits = (byte) ((byte) charArray[i] & mask); 
    ba[j] = upper8bits; 
    ba[j+1] = lower8bits; 
    System.out.println("byte[]:" + Integer.toHexString(ba[j+1])); 
} 
1

Đơn giản chỉ cần cast mỗi byte:

byte a[]={(byte)0x01,(byte)0x01,(byte)0x01,} 
+0

Câu trả lời này rất hữu ích cho tôi (không chắc tại sao những câu trả lời khác lại khá phức tạp!). –

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