У меня есть требование отправлять данные из собственной программы, написанной на C, через Sockets, а именно интерфейс winsock. Эти данные затем получаются программой Java. Java-программа получает пакет данных, для которого она знает порядок и выполняет некоторую обработку. Он принимает int, полученный из socket.Read () как client_socket.getInputStream().read()
Обработка этих int-данных, возвращаемых из Read (), анализируется для получения ожидаемых типов данных. В основном это нарезка полученных данных. Я могу только предположить, что функции read () читают 4 байта за раз (32-битный размер Java). Итак, я продолжаю разделять эти 4 байта (8 битов, а не тип Java) на 4 шорты Java, чтобы я мог правильно представить значения без знака, которые они представляют.
После того, как у меня есть 4 шорта, если я знаю, что хочу, например, uint16, я просто объединяю 2 шорта
Проблема в том, что где-то я делаю неправильные манипуляции с битами, которые не работают так, как я думал.
Код C и код Java приведены ниже, и он действительно прост, хотя он не работает. Вывод - это то, что я не могу понять, почему это так.
0 0 0 0 0 1 0 0 0 2 0 0 0 3 0 0 0 4 {...}
Код C отредактировал часть инициализации:
uint16_t buffer[255] = {};
uint16_t *current_pointer = buffer;
for(uint16_t index = 0; index < 255; index++) {
*current_pointer = index;
current_pointer++;
}
Write(client_socket, (char *)buffer, sizeof(buffer));
Код Java также отредактирован:
public final short[] JavaIntToUint8Array(int unsigned_int) {
return new short[] { (short)((unsigned_int & 0xFF000000L) >> 24),
(short)((unsigned_int & 0x00FF0000L) >> 16),
(short)((unsigned_int & 0x0000FF00L) >> 8),
(short)((unsigned_int & 0x000000FFL))};
}
public final int[] JavaIntToUint16(int unsigned_int) {
short uint8_array[] = JavaIntToUint8Array(unsigned_int);
return new int[] { (int)(uint8_array[0] << 8) | (int)uint8_array[1],
(int)(uint8_array[2] << 8) | (int)(uint8_array[3]) };
}
...
while (index < 255) {
read_data = data_input.read();
System.out.print(" ");
System.out.print(JavaIntToUint16(read_data)[0]);
System.out.print(" ");
System.out.print(JavaIntToUint16(read_data)[1]);
System.out.print("\t");
index++;
}