2015-06-29 2 views
1

Это правильный способ смещения бит в символ?Char из байт-массива в Java ME

char value = (char)((array[offset] << 9) + (array[offset + 1])); 

Если нет, пожалуйста, исправьте меня.

+3

Вероятно, это должно быть '<< 8' вместо' 9', если я правильно понял то, что вы пытаются сделать. –

+0

То, что я пытаюсь сделать, это на самом деле переключение бит в unsigned short, но поскольку в Java ME такой вещи нет, char, вероятно, выполнит эту работу, даже если это действительно уродливо. – parek

+0

'array' - массив байтов? Похоже, что Тагир просто дал вам ответ. – sstan

ответ

0

Байты на Java немного сложны. Они не идут от 0 до 255, как вы могли бы использовать с других языков. Вместо этого они идут от 0 до 127, а затем от -128 до -1.

Это означает, что все байты в вашем byte массиве, который находится ниже 128 будут преобразованы в правильноchar с этим кодом:

char value = (char)((array[offset] << 8) + (array[offset + 1])); 

Но если значение byte выше 127, вы будете вероятно, получить результаты, которых вы не ожидали.

Небольшой пример:

class test { 

    public static void main(String[] args) { 

    byte b = (byte)150; 
    char c = (char)b; 
    int i = (int)c; 

    System.out.println(b); 
    System.out.println(c); 
    System.out.println(i); 

    } 
} 

Выведет это:

-106 
ヨ 
65430 

Не совсем то, что вы могли бы ожидать. (В зависимости от того, насколько хорошо вы знаете Java).

Таким образом, чтобы правильно преобразовать 2 байта в полукокса, вы, вероятно, хотите функцию, как это:

char toChar(byte b1, byte b2) { 
    char c1 = (char)b1; 
    char c2 = (char)b2; 
    if (c1<0) c1+=256; 
    if (c2<0) c2+=256; 
    return (char)((c1<<8)+c2); 
} 
+0

Удивительно, но я не нашел эту информацию ни в каких ссылках, или, может быть, я не искал достаточно. – parek

+0

Предполагается, что это общеизвестно для любого Java-кодера, но я тоже на него напал и имел большие проблемы при использовании байтового массива для моих игровых уровней и долгое время выяснял, что происходит. :-) –