Вот мой код:
byte[] cmd = new byte[19];
cmd[0] = (byte) 0xFF;
cmd[1] = (byte) 0x2C;
for (int i = 2;i < 19; i++) {
cmd[i] = (byte) 0x00;
}
cmd[18] = (byte) 0x00;
System.out.println("Command Send =>"+Arrays.toString(cmd));
Его показать мне для cmd [0] a -1 вместо 255. Я думаю, что мой компилятор принимает подписанный тип байта. Если я прав, можно использовать unsigned byte?
Возможно, вы смущены различием между хранилищем и представлением.
Как говорили вам другие, Java использует только подписанные интегральные типы. В качестве байта используется только 8 бит, это означает, что у вас есть диапазон от -128 до 127. Но имейте в виду: это только десятичное представление, которое не говорит вам о двоичном хранилище!
Лучшим напоминанием для диапазона байтового типа Java будет следующее (десятичное) представление:
0 1 ... 126 127 -128 -127 ... -2 -1
Это непосредственно соответствует следующему двоичному представлению:
00000000 00000001 ... 11111110 11111111
Подписанное десятичное представление называется двумя дополнениями. Как вы можете видеть, двоичное значение 11111111, равное 0xFF, соответствует (подписанному) десятичному значению -1.
Если вы отправите это значение через поток, вы получите полное значение 0xFF, независимо от того, что вы видите на выходе программной консоли Java.
В byte
типа Java подписывается, в java нельзя использовать "unsigned byte". Обходным путем было бы использование short
типов
int z = (0xFF & byte[x])
) или отправить и получить short[]
или int[]
вместо byte[]
Каждый раз, когда вы работаете с байтовой переменной в Java, (byte) 0xFF
будет неявно преобразован в (int) 0xFFFFFF
(т.е. -1
). Вы можете сделать 0xFFFFFF & 0xFF
а затем вы получите (int) 255
по вашему желанию (вы никогда не сможете получить (byte) 255
, только (int) 255
).
Если вам нужно хранить только байты, неважно, как на экране выводится 0xFF, он по-прежнему (байт) 0xFF внутри. Если вам нужно работать с ними (по сравнению с int, добавлением, вычитанием, преобразованием в строку, печать на экране и в основном что-либо еще), тогда вам нужно знать, что они будут преобразованы в int 0xFFFFFF, который интерпретируется -1.