Неверное значение в байтовом массиве через Perl и сокет Java - PullRequest
0 голосов
/ 06 декабря 2010
Perl
x=1
y=222

java
x=257
y=222

Я понимаю, что я могу поставить только целое число от 0 до 256 в байте. Как отправить целое число больше 256 в pack(C*) или byte[][]?

$data = $n->read($data2, 6);
@arr =  unpack("C*", $data2);

Иногда, когда я отправляю значение из Perl в Java, я ловлю отрицательное значение на стороне Java, проблема в том, что я хочу сохранить только байтовый массив.

Это код Java от MousePressed на качелях (Хочу отправить на сервер текущий клик)


public void mousePressed(MouseEvent e) {
        Point p = e.getPoint();
        byte[] buff = new byte[]{02,00,(byte)p.x,(byte)p.y,00,00};
                //write buff on my socket

Спасибо

Ответы [ 2 ]

0 голосов
/ 06 декабря 2010

Вы можете отправить 32-битные значения следующим образом.

DataOutputStream dos = ...
dos.writeByte(2);
dos.writeByte(0);
dos.writeInt(p.x);
dos.writeInt(p.y);
dos.writeByte(0);
dos.writeByte(0);
dos.flush(); // assuming you use buffering.
0 голосов
/ 06 декабря 2010

Java-байты подписаны, и они будут держать свой знак, когда вы попытаетесь преобразовать обратно в целое число. Поэтому, если вы хотите извлечь целое число из массива длиной 4 байта, вам нужно сделать что-то вроде

int num = 0;
for(int i=0;i<4;i++){
    num <<= 8;
    num |= byteArray[i] & 255;
}
return num;

Если вы пропустите "& 255", вы, вероятно, не получите номер, который ожидали

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...