前提・実現したいこと
TCPIPによりc言語のプログラム(Client側)からPython 2.7のプログラム(Server側)へデータを渡したい。※c言語のプログラムはYOLOv3を実装しているプログラムの一部で,下のコードはdarknet上のsrc/image.cというプログラムの中で、検出した物体のピクセル位置を出力する関数です。Pythonはただの自作のスクリプトで、ROS上で動かすものです。
ここに質問の内容を詳しく書いてください。
サーバ側で受け取ったデータをきちんと変換できず、
return codecs.utf_8_decode(input, errors, True)
UnicodeDecodeError: 'utf8' codec can't decode byte 0x9a in position 4: invalid start byte
というエラーが帰ってきます。
発生している問題・エラーメッセージ
return codecs.utf_8_decode(input, errors, True) UnicodeDecodeError: 'utf8' codec can't decode byte 0x9a in position 4: invalid start byte
該当のソースコード
Python
1#!/usr/bin/env python 2# coding: UTF-8 3import rospy 4from std_msgs.msg import String 5import socket 6import datetime 7def talker(): 8 pub = rospy.Publisher('chatter', String, queue_size=10) 9 rospy.init_node('talker', anonymous=True) 10 PORT = 50000 11 BUFSIZE = 4096 12 server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 13 server.bind(("", PORT)) 14 server.listen(1) 15 while not rospy.is_shutdown(): 16 client, addr = server.accept() 17 msg = str(datetime.datetime.now()) 18 client.sendall(msg.encode("UTF-8")) 19 print(msg, "Oh, you got message!!!") 20 data = client.recv(BUFSIZE) 21 print(data.decode("UTF-8")) 22 client.close 23 hello_str = "hello world %s" % rospy.get_time() 24 pub.publish(hello_str) 25 26if __name__ == '__main__': 27 try: 28 talker() 29 except rospy.ROSInterruptException: 30 pass
c
1void draw_detections(image im, detection *dets, int num, float thresh, char **names, image **alphabet, int classes) 2{ 3 int i,j; 4 5 for(i = 0; i < num; ++i){ 6 char labelstr[4096] = {0}; 7 int class = -1; 8 for(j = 0; j < classes; ++j){ 9 if (dets[i].prob[j] > thresh){ 10 if (class < 0) { 11 strcat(labelstr, names[j]); 12 class = j; 13 } else { 14 strcat(labelstr, ", "); 15 strcat(labelstr, names[j]); 16 } 17 printf("%s: %.0f%%\n", names[j], dets[i].prob[j]*100); 18 printf(" -> (x, y, w, h)\n"); 19 20 printf(" = (%d, %d, %d, %d)\n", 21 (int)(dets[i].bbox.x*im.w), 22 (int)(dets[i].bbox.y*im.h), 23 (int)(dets[i].bbox.w*im.w), 24 (int)(dets[i].bbox.h*im.h)); 25 printf("初期化はOK\n"); 26 int detection_coordinates[3]; 27 28 detection_coordinates[0] = (int)(dets[i].bbox.x*im.w); 29 detection_coordinates[1] = (int)(dets[i].bbox.y*im.h); 30 detection_coordinates[2] = (int)(dets[i].bbox.w*im.w); 31 detection_coordinates[3] = (int)(dets[i].bbox.h*im.h); 32 printf("代入はOK\n"); 33 34 char x[256]; 35 sprintf(x, "%d", detection_coordinates[0]); 36 printf(x); 37 char server_response[256] = "you reached to the server"; 38 //tcpip 39 int network_socket; 40 //socket() 41 //specifies to use TCP 42 network_socket = socket(AF_INET, SOCK_STREAM, 0); 43 if(network_socket < 0){ 44 printf("ERROR opening socket dude."); 45 } 46 struct sockaddr_in server_address; 47 server_address.sin_family = AF_INET; 48 server_address.sin_port = htons(50000); 49 server_address.sin_addr.s_addr = INADDR_ANY; 50 51 //connect() 52 int connection_status = connect(network_socket, (struct sockaddr *) &server_address, sizeof(server_address)); 53 if(connection_status == -1){ 54 printf("connect() error\n"); 55 sleep(1); 56 } 57 else { 58 //send() 59 //char server_response[256]; 60 send(network_socket, &x, sizeof(x), 0); 61 //colse() 62 close(network_socket); 63 sleep(1); 64 } 65 // 66 } 67 }
試したこと
Python(サーバ側)で、print(data.decode("UTF-8"))のdecodeをCP932、shift-jisでも試してみましたが同じ結果でした。"UTF-16"でやるとエラーは出ませ得んが、文字化けで何がprintfで出力されているのか全くわかりません。
補足情報(FW/ツールのバージョンなど)
Ubuntu18.04で動かしています。
ここにより詳細な情報を記載してください。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/09/05 13:24
2021/09/09 22:37