Я пытаюсь отправить знаковые целые числа Java по TCP на клиент C.Отправка Java int на C через TCP
На стороне Java я пишу целые числа к OutputStream так:
static ByteBuffer wrapped = ByteBuffer.allocateDirect(4); // big-endian by default
public static void putInt(OutputStream out, int nr) throws IOException {
wrapped.rewind();
wrapped.putInt(nr);
wrapped.rewind();
for (int i = 0; i < 4; i++)
out.write(wrapped.get());
}
На стороне С, я прочитал целые числа, как так:
int cnt = 0;
char buf[1];
char sizebuf[4];
while(cnt < 4) {
iResult = recv(ConnectSocket, buf, 1, 0);
if (iResult <= 0) continue;
sizebuf[cnt] = buf[0];
cnt++;
}
Однако, как я преобразовать массив символов в целое число в C?
Редактировать
Я попробовал следующее (и наоборот):
int charsToInt(char* array) {
return (array[3] << 24) | (array[2] << 16) | (array[1] << 8) | array[0];
}
Отредактировано снова, потому что я забыл теги.
данных
Для примера того, что происходит в данный момент:
я получаю:
char 0
char 0
char 12
char -64
the int becomes 2448
и использовать эту функцию для создания Int из массива полукокса:
int charsToInt(char* array) {
return ntohl(*((int*) array));
}
Я ожидаю, что подписанный i nteger: 3264
Update Я расследую больше после некоторого сна ..
Update У меня есть клиент Java, который интерпретирует целые числа правильно и получает те же байты:
0
0
12
-64
@AndyThomas: Да, но он зацикливается –
Вы говорите: «Я пробовал следующее», но вы не говорите, как вы знаете, что это не сработало. Каковы были значения в массиве, которые вы предоставили, и каково было целое число, которое было возвращено? Вы подтвердили это в отладчике или распечатали значение? Если вы напечатали его, какое заявление вы использовали для его печати? Эта информация важна. Вот пример его работы: http://ideone.com/EZNCGs – indiv
@RobotRock: можете ли вы, по крайней мере, печатать отдельные байты –