Я хочу отправить массив 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);
}
Одна из проблем, которую я вижу, - если вы получаете 100 символов, вы развращаете данные этой строкой:
buffer[99] = '\0';
Если в этой позиции есть символ, отличный от NULL, вы испортили данные. Поскольку данные двоичные, нет необходимости в нулевом завершении buffer
. Удалите эту строку из цикла.
Вместо этого полагайтесь на возвращаемое значение recv
для определения количества символов, которые нужно скопировать в поток. Что вызывает еще один момент - вы не проверяете, возвращает ли recv
ошибку.
[99]
в 0 или не проверять возвращаемое значение, которое было источником проблемы?
buffer
(buffer[99] = '\0';
строка). Поскольку это двоичные данные, оставьте их в покое и положитесь на возвращаемое значениеrecv
чтобы определить, сколько байтов нужно скопировать вwav
. Редактировать: Бьюсь об заклад, что это проблема - вы путаете данные с этой строкой.