Как установить 4-битный битовый шаблон для магического числа в Java? - PullRequest
1 голос
/ 24 июня 2011

Я работаю над сетевым программированием на машине linux с использованием C ++, и мне было интересно, как я могу установить 4-битный битовый шаблон для магического числа в Java (клиент). Также, как мне установить тот же битовый шаблон в c ++ co, я могу сравнить один из клиента с другим на стороне сервера.

Спасибо заранее ..

Редактировать

Так что теперь у меня есть это

    byte[] signature = new byte[4];

    for(int i=0; i<4; i++){
        signature[i] = (byte) 0xA9;
    }

И если я посмотрел внутреннюю часть массива после цикла for отладчика, то у меня будет

{-89, -89, -89, -89}

И я сделал что-то подобное в C ++

    uint8_t m_magicNumberBuffer[4];
    magicKeyRead = read(m_fd, m_magicNumberBuffer, SIZE_OF_HEADER);


    if(m_magicNumberBuffer[0] == 0xA9 && m_magicNumberBuffer[1] == 0xA9 && m_magicNumberBuffer[2] == 0xA9 && m_magicNumberBuffer[3] == 0xA9){
        printf("SocketClient::recvMagicKey, Magic key has been found \n");
        break;
    }

Я как-то работает, но не уверен, что я объявил m_magicNumberBuffer и целое число без знака, но они были отрицательными 89 в java. Это нормально, чтобы сделать это таким образом?

Заранее спасибо.

Ответы [ 4 ]

3 голосов
/ 24 июня 2011

В Java есть побитовые операторы, например, побитовое ИЛИ |, побитовое И & и битовые операторы сдвига >>>, >> и <<, очень похожие на те, что есть в C ++.Вы можете использовать их для точного управления битами.

Поскольку вы не объясняете более подробно, что вы хотите сделать, я не могу дать вам более подробный ответ.

1 голос
/ 24 июня 2011

В Java вы бы представляли его как

byte[] signature=new byte[4];

в C ++, это было бы

uint8_t signature[4];

Затем вы можете получить доступ к каждому из байтов индивидуально в качестве элементов массива.

Оба языка поддерживают шестнадцатеричные коды, так что, например, вы можете сделать

signature[0]=0xA9;

в java или C ++, и он установит первый бит в A9 в шестнадцатеричном формате (то есть 10101001 в двоичном)

0 голосов
/ 24 июня 2011

На самом деле вы имеете дело с четырьмя байтами необработанной памяти;все, что вас интересует, это битовый шаблон, а не числовые значения.В восьми битах (размер byte в Java) -89 и 0xA9 имеют одинаковую комбинацию битов: 10101001.Поскольку byte подписано в Java, выгрузка значения покажет отрицательное значение, что довольно противоречиво, но в Java нет восьмибитного типа без знака.Представление в byte и попытка поместить его в signed char в C ++ недопустимо. Но Java не заботится о таких тонкостях.

0 голосов
/ 24 июня 2011

Когда вы пишете в DataOutputStream, вы пишете 8-битные байты (знак не важен)

String filename = "text.dat";
DataOutputStream dos = new DataOutputStream(new FileOutputStream(filename));
for (int i = 0; i < 4; i++)
    dos.write(0xA9);
dos.close();

DataInputStream dis = new DataInputStream(new FileInputStream(filename));
for (int i = 0; i < 4; i++)
    System.out.println(Integer.toHexString(dis.readUnsignedByte()));
dis.close();

печатает

a9
a9
a9
a9

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

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