26

My code looks like this:

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 tells me:

possible loss of precision - required byte, found int

What am I doing wrong? If I use a short instead of the int it works correctly.

5 Answers 5

38

Byte is a signed datatype in Java. It can take values from -128 (-0x80) to 127 (0x7f). Some of your constants won't fit in this range and are not, therefore, valid byte's. That's unlike C++, where BYTE is usually defined to be unsigned char. Also, Java is stricter about datatype conversions with loss of precision.

So 0xF2 is not a valid byte literal. It's a valid short and int and long. Java employs the crazy notion of negative hex literals for values like those. A negative hex literal for 0xF2 would be -0x0e.

Depending on your situation, either use a larger datatype, or use inline conversion (like (byte)0xF2), or use something like Excel to convert your literals of value 0x80 and more to negative-hex representation.

Sign up to request clarification or add additional context in comments.

3 Comments

It's worth pointing out that casting an int that's between 0x80 and 0xFF to a byte will generally give you the negative byte you "want". That is, the bit pattern isn't changed by the cast, only truncated, and unless you need to do maths over the bytes, things should work as expected, and the up-front conversion isn't strictly necessary.
i need to do some operations with this values
Well then, make it a short array.
12

Bytes in Java (as all primitive number types) are signed.

The valid range of byte values is -128 to 127.

Thus, there is no byte that has the same value as the integer 0xFF = 255, but you need a cast, which is what your compiler is warning you of. Note that 255 will actually become -1.

Try the following code yourself:

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)

This should print true, true, false, true, true, true as indicated.

You must realize that == when applied to byte == int, converts the (signed) byte to a (signed) integer, and byte -1 should of course become int -1.

2 Comments

and if i do operations with this values i will get the same result?
The operations will likely up-cast this to the integer, so (int)((byte)0xFF) == 0xFFFFFFFF. I'll update my reply.
7

Simply cast every byte:

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

1 Comment

This answer worked great for me (not sure why the other ones are quite so complicated!).
5

As an alternative, in Java 7 you write byte literals in binary notation. eg. 0b101 is 5.

Comments

1

Instead of taking 0XFF we could use 0X7F and follow up the code as below

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]));
}

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.