Я не использую Java, но я постараюсь объяснить, что происходит.
Значение 8188
равно 0x1ff8
в шестнадцатеричном гексе. Когда ваша программа запущена, результат на самом деле 8188 - 65536 = -57348
. Вот почему вы получили результат, который вы сделали.
Поскольку входные данные являются двоичными числами с прямым порядком байтов, только первый бит b[0]
должен проверяться на наличие знака. То, что я сделал в C #, было:
public static String GetBinary(byte[] b, int decimalPointLocation)
{
long val = 0;
if ((b[0] & 0x80) != 0)
{
val = -1;
}
for (int i = 0; i < b.Length; i++)
{
val = (val << 8) + b[i];
}
string s = Convert.ToString(val);
return s;
}
Для byte[] b = {0x1f, 0xfc}
возвращаемое значение равно 8188
. Для byte[] b = {0xe0, 0x04}
возвращаемое значение равно -8188
.
Хотя я использовал аналогичные операции с подстрокой для вставки десятичной точки для этих значений, вы должны знать, что абсолютные целочисленные значения меньше 100 не могут быть должным образом отформатированы для двух десятичных знаков с помощью этого метода.