Ваш первый шаг в этой ситуации должен состоять в том, чтобы увидеть, что отправляется «по проводам».Если вы можете, рассмотрите возможность использования wireshark или tcpdump , чтобы увидеть, что передается.Таким образом, вы можете выяснить, что не работает, как ожидалось.Оба могут отслеживать сокеты, привязанные к локальным IP-адресам, а также петлевые сокеты.
Но, судя по всему, я согласен, что происходит конфликт со знаком / без знака.
Если у вас естьэтот вывод будет полезен при определении "кто" виноват.
Обновление:
Как уже упоминалось, вы хотите замаскировать и использовать толькомладшие 8 бит, и это можно сделать следующим образом:
b = b & 0xFF
Вы можете ввести это в свой код двумя способами, один из них - через простую статическую функцию, которую вы вызываете для каждого байта, например,
public static int mask(int rawbyte)
{
return (rawbyte & 0xFF);
}
Другая функция-обертка для DataInputStream.read (), которая считывает байты в буфер, а затем маскирует их все.Это может выглядеть примерно так:
public static int socket_read(DataInputStream dis, int arr[], int off, int len)
{
b = new byte[len];
int rv = dis.read(b, off, len);
for(int i=0; i < len; i++)
{
arr[i] = ((int)b[i]) & 0xFF;
}
return rv;
}
Если вы выбрали первый способ, вам нужно вызывать mask () для любого значения буфера [], которое вы используете.Так что
len |= buffer[5];
будет
len |= mask(buffer[5]);
Если вы выберете второй способ, вы измените буфер с массива типа byte на int:
buffer = new int[...]
и может обновить ваш цикл while до чего-то вроде:
while( (bytes = socket_read(dis, buffer, 0, 40)) != -1)
Но это, как говорится ...
Лучшим вариантом, чем любой из них, является использование DataInputStream readUnsignedBytemethod .
Вы должны были бы самостоятельно вытащить 40 байтов из потока за раз, но было бы намного более понятно, что вы делаете, а не немного вертелось.Это был бы предпочтительный подход на мой взгляд.