Как отправить Java-байт [] на сокете tcp на C ++ char [] на сервере?

0

Я хочу отправить массив byte [] из java-клиента на сервер, который получает данные в C++. Байт-массив содержит символы и целые числа, которые преобразуются в байты (его заголовок волны). Сервер не получает значения правильно. Как я могу отправить байт [], чтобы серверный сокет мог записать его в char []? Я использую следующий код:

Client.java:

//Some example values in byte[]
byte[] bA = new byte[44];
bA[0]='R';
...
bA[4]=(byte)(2048 & 0xff);
...
bA[16] = 16;
....

//Write byte[] on socket
DataOutputStream out = new DataOutputStream(socket.getOutputStream());
out.write(bA,0,44);

server.cpp

int k = 0,n = 0;
char buffer[100];
ofstream wav("out.wav", ios::out | ios::binary);
while(k<44){//receive 44 values
    memset(buffer ,0 , 100);
    n = recv(sock , buffer , 100 , 0);
    k += n;
    buffer[99] = '\0';
    wav.write(buffer,n);
}
  • 2
    Не обнулять нулевой buffer ( buffer[99] = '\0'; строка). Поскольку это двоичные данные, оставьте их в покое и положитесь на возвращаемое значение recv чтобы определить, сколько байтов нужно скопировать в wav . Редактировать: Бьюсь об заклад, что это проблема - вы путаете данные с этой строкой.
  • 0
    Может быть, распечатать массив на каждом языке (например, в шестнадцатеричном формате). Есть ли очевидная закономерность? Некоторые части правильные, а некоторые нет? Все ли компенсировано одной и той же суммой (будет указывать на возможную подписанную / неподписанную проблему)?
Показать ещё 1 комментарий
Теги:
sockets
bytearray

1 ответ

2
Лучший ответ

Одна из проблем, которую я вижу, - если вы получаете 100 символов, вы развращаете данные этой строкой:

buffer[99] = '\0';

Если в этой позиции есть символ, отличный от NULL, вы испортили данные. Поскольку данные двоичные, нет необходимости в нулевом завершении buffer. Удалите эту строку из цикла.

Вместо этого полагайтесь на возвращаемое значение recv для определения количества символов, которые нужно скопировать в поток. Что вызывает еще один момент - вы не проверяете, возвращает ли recv ошибку.

  • 0
    @ user2212461 Мне любопытно; Было ли это установить [99] в 0 или не проверять возвращаемое значение, которое было источником проблемы?
  • 0
    нулевое завершение было причиной. С кодом выше я всегда использую сначала один символ, а затем остальные. (Всегда два цикла). Ты знаешь почему?
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню