2015-08-13 1 views
3

Я пытаюсь запрограммировать сообщение типа квитирования следующим образом, где C = Клиент S = Сервер:Byte Операции и Датаграммы в Java

C-->S: "I'd like to talk" //session initiation 
S-->C: "80" //(n, randomly generated number) 
C-->S: "81" //(n+1) 
S: "does n= (n+1)-1?" //confirms the connection. 

Для целей данного вопроса предположим, что логика выше правильно. Я хотел бы, чтобы случайное число, которое я сгенерировало, было 32-битным числом (т. Е. 4 байта, отправленного в дейтаграмме UDP). Так как INT 32 бита, я предпочел бы использовать этот тип данных, но мне кажется, бежать в одну из двух проблем:

  1. При использовании массива байт, легко отправить в дейтаграммах, но трудно для выполнения простой математической операции (например, вычитания 1) для 32-битного числа.
  2. При использовании int легко выполнить простую математическую операцию, но трудно преобразовать между ints и байтами при отправке туда и обратно между клиентом и сервером.

Я нашел метод, который может конвертировать из int в байты. Я нашел некоторую информацию об использовании Bytebuffer для преобразования в int, но я не уверен, что это даже правильно. Есть ли более простой способ сделать процесс отправки int в дейтаграмме? Похоже, что огромная работа заключается в том, чтобы продолжать конвертировать между байтами и ints.

+0

Я не думаю, что у вас есть много выбора в отношении передачи информации в виде массива байт. Как еще вы можете его отправить? –

ответ

0

Есть два варианта:

  • выше упомянутых ByteBuffer
  • превращающих через Bitshift:

    //int to byte[] 
    int val = someval; 
    byte[] bytes = new byte[4]; 
    
    for(int i = 0 ; i < 4 ; i++) 
        bytes[i] = (byte) (val >>> (i * 8)); 
    
    //byte[] to int 
    int val = 0; 
    byte[] bytes = input(); 
    
    for(int i = 0 ; i < 4 ; i++) 
        val |= ((int)(bytes[i])) << i * 8; 
    
1

Ничего сложного о любом из этих операций. DataInputStream и DataOutputStream позаботиться о преобразованиях stream->int->stream и ByteArrayInputStream и ByteArrayOutputStream позаботиться о преобразованиях stream->byte[]->stream.

0

Если вы определяете свой собственный формат дейтаграммы, достаточно легко установить, что nth 4 байта содержимого представляют собой целое число.

Вы можете использовать некоторые простые функции преобразования, чтобы перейти от int к byte[] и наоборот.

Небольшой класс, реализующий эти два метода должны сделать:

public static byte[] toByteArray(int value) { 
    byte[] b = new byte[4]; 

    // MSB to LSB 
    b[0] = (byte) (value >> 24); 
    b[1] = (byte) (value >> 16); 
    b[2] = (byte) (value >> 8); 
    b[3] = (byte) (value); 

    return b; 
} 

public static int fromByteArray(byte[] value) { 
    int i = ((((int) value[0]) & 0xFF) << 24) | 
      ((((int) value[1]) & 0xFF) << 16) | 
      ((((int) value[2]) & 0xFF) << 8) | 
      ((((int) value[3] & 0xFF))); 
    return i; 
} 
Смежные вопросы