Androidタブレットからオーディオを録音して、Pythonサーバーに送信しようとしています。バイトパケットの開始時に、私はAndroidアプリケーションの状態に関するいくつかの関連情報を含んでいます( "actives"と呼ばれるバイト配列ですが、Javaサーバによってうまく受信されたと考えれば、これは関係ありません)。アンドロイドコードは次のとおりです。UDPパケットはJavaで正常に受信されましたが、Pythonで破損しました
int read = recorder.read(buffer, 0, buffer.length);
for (int a = 0; a < actives.length; a++) {
outBuffer[a+1] = (byte)actives[a];
logger = logger + Byte.toString(actives[a]) + ",";
}
int furthest=0;
for(int a =0; a < buffer.length; a++){
outBuffer[actives.length+1+a]=buffer[a];
if(buffer[a]!=0)furthest=a;
}
packet = new DatagramPacket(outBuffer, read,
serverAddress, PORT);
Log.d("writing", logger+Byte.toString(outBuffer[7])+".length"+Integer.toString(1+furthest+actives.length+1));
Log.d("streamer","Packet length "+outBuffer.length);
try {
socket.send(packet);
}catch (IOException e){
Log.e("streamer", "Exception: " + e);
}
Log.d("streamer","packetSent");
Javaサーバーを使用して、相手側にきれいな信号を受信します。受け取ったJava出力の 画像:!(http://i.imgur.com/31UWzya.png) は、これは私のJavaサーバである:ここで
DatagramSocket serverSocket = new DatagramSocket(3001);
int byteSize=970;
byte[] receiveData = new byte[byteSize];
DatagramPacket receivePacket = new DatagramPacket(receiveData,
receiveData.length);
while(true){ // recieve data until timeout
try {
serverSocket.receive(receivePacket);
String rcvd = "rcvd from " + receivePacket.getAddress();
System.out.println("receiver"+"Received a packet!" +rcvd);
break;
}
catch (Exception e) {
// timeout exception.
System.out.println("Timeout reached without packet!!! " + e);
timeoutReached=true;
break;
}
}
if(timeoutReached)continue;
currTime = System.currentTimeMillis();
data = receivePacket.getData();
は私のPythonサーバーの出力です: (http://i.imgur.com/RYkcCCE.png) そして、ここではコードです:!
import socket
ip="192.ip.address"
port=3001;
sock=socket.socket(socket.AF_INET,socket.SOCK_DGRAM);
sock.bind(('',port));
while(True):
data,addr=sock.recvfrom(970);
print("address",addr);
print("received a data!");
print(data);
pythonスクリプトの最後の行で、「print(data)」を「print(data.decode())」に変更しようとしましたが、その場合はこのエラーが表示されます:
UnicodeDecodeError: 'ascii' codec can't decode byte 0xff in position 0: ordinal not in range(128)
私は同時にこれらのサーバーを実行していません 私は、unsigned intsとpythonを使ってJavaで何かをしなければならないと思います。 data.decode()が機能していないので、このデータをPythonで変換できる方法はありますか?別の方法として、Javaでデータを何とか変換できるはずですか?私が試したstackoverflowの答えのどれも働いていません。
ありがとうございました。あなたが言及したエンコーディングと他のさまざまなエンコーディングを試しましたが、私はまだPythonでスクランブルされた出力に終わります。 私は分かりません。これは非常にシンプルなビットストリームです(オプションは-256から256までです)。私はバイト配列として挿入しています。このようなシンプルなデータ型を送信することについては心配する必要はありません – Kevin
バイナリデータを扱う場合は、Base64エンコーディングを使用することをお勧めします。 Javaプログラムのバイナリデータを[エンコード]する(https://commons.apache.org/proper/commons-codec/apidocs/org/apache/commons/codec/binary/Base64.html#encodeBase64String(byte [])) withと[decode](https://docs.python.org/2/library/base64.html#base64.b64decode)をPythonサーバーに戻します。なぜこれが良い習慣であるかに関する詳細:http://stackoverflow.com/questions/201479/what-is-base-64-encoding-used-for –