Запись неподписанного целого числа 4 байта по сети - PullRequest
3 голосов
/ 20 октября 2011

У меня проблема с записью целого числа 4 байта в Java.

Запись длинного значения в java приводит к разным результатам на 64-битных MacOS и 32-битных Linux (Ubuntu) ИЛИ ЖЕ Запись в сеть 4-байтового целого без знака имеет проблему.

Следующий вызов отлично работает на моем локальном OSX

writeUInt32(999999,outputstream)

Чтение обратно дает мне 999999

Однако, когда приложение развернуто в сети, запись длинного значения приводит к некоторому другому случайному числу (я полагаю, что порядковый номер был переключен?), А чтение его дает мне другое большое число.

---------- Полный набор методов приведен ниже ---------------

public void writeUInt32(long uint32,DataOutputStream stream) throws IOException {
        writeUInt16((int) (uint32 & 0xffff0000) >> 16,stream);
        writeUInt16((int) uint32 & 0x0000ffff,stream);
    }

public void writeUInt16(int uint16,DataOutputStream stream) throws IOException {
        writeUInt8(uint16 >> 8, stream);
        writeUInt8(uint16, stream);
    }

public void writeUInt8(int uint8,DataOutputStream stream) throws IOException {
        stream.write(uint8 & 0xFF);
    }

Редактировать: чтобы добавить к путанице запись в файл и затем передачу его по сети, отправьте мне правильное значение! Поэтому, когда outputtream указывает на локальный файл, он записывает правильные значения, но когда outputtream указывает на ByteArrayOutputStream, тогда записанное длинное значение является неправильным.

1 Ответ

6 голосов
/ 20 октября 2011

Просто используйте DataOutput / InputStream.

Для записи приведите ваш long к int

public void writeUInt32(
      long uint32,
      DataOutputStream stream
    ) throws IOException
{
    stream.writeInt( (int) uint32 );
}

При чтении используйте readInt, присвойте long и замаскируйте старшие 32 битачтобы получить значение без знака.

public long readUInt32(
      DataInputStream stream
    ) throws IOException
{
    long retVal = stream.readInt( );

    return retVal & 0x00000000FFFFFFFFL;
}

РЕДАКТИРОВАТЬ

Судя по вашим вопросам, вы путаетесь с преобразованиями и приведениями в Java для примитивных типов.

Прочтите этот раздел спецификации Java по конверсиям и предложениям: http://java.sun.com/docs/books/jls/third_edition/html/conversions.html

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