亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何將 python 字節數組追加轉換為 C++

如何將 python 字節數組追加轉換為 C++

白板的微信 2023-07-11 17:15:26
我對 ROS 和嵌入式 C++ 編程非常非常陌生。我討厭 Python,我希望將最初用 Python 編寫的節點轉換為 C++。我不會詳細介紹這種轉換,我對我采用的 OOP 方法很滿意(將訂閱者回調放入類中,將發布者作為類成員),但主要問題是 python 中處理所需字節數組的一段代碼用于與 Arduino 進行通信。我從未在 C++ 中使用過字節和位,事實證明人們使用 Python 是因為其友好的 Pyserial 庫,而 C++ 中的等效方法非常黑暗,特別是在 Linux 操作系統上。Python代碼是:def function_callback(my_data):global packetmy_array=my_data.dataprint(my_array)packet = bytearray()for byte in my_array:    packet.append(byte+48)packet.append(0x0A)packet.append(0x0D)我知道這需要 ROS std_msgs/ByteMultiArray 類型的 my_data,將實際數據從該消息傳遞到數組 my_array,現在該數組中的元素被讀取為 ASCI 而不是位,因此 for 循環將 48 添加到中的每個元素為了得到他們的十進制值。最后兩個附加是 Arduino 中需要的一些特殊字節。在 C++ 中我不知道如何做到這一點。我在這里找到了說明并創建了一個 SerialComm 類,它本質上模仿了該代碼,該類中最重要的方法應該是:void SerialComm::write_port(unsigned char* msg){   int i=write(serial_port, msg, sizeof(msg));}我不確定參數是否應該具有 unsigned char* 數據類型,但似乎 unistd.h 中的 write 函數支持這一點。總的來說,我如何準備“數據包”并將其發送到端口?更具體地說,我需要寫入的數據是ROS中的std_msgs/ByteMultiArray類型,我檢查了它,實際數據是std::vector<signed char>類型,我嘗試將此作為解決方案:unsigned char* make_byte_array(std::vector<signed char> array) const{    unsigned char retval[array.size()+2];    int i=0;    while (i<array.size())    {       retval[i]=array[i];       i++;    }    retval[i+1]=0x0A;    retval[i+2]=0x0D;    return retval; }這個函數顯然是無意義的,但是它編譯了,它自然不起作用,因為返回了 retval 變量的地址,沒有其他任何東西,但我主要試圖以某種方式將 unsigned char* 傳遞給該 write 函數以將數據寫入端口。當然,主要問題是如何將從 std_msgs/ByteMultiArray 獲得的 std::vector 數組轉換為寫入 arduino 端口所需的任何內容,并本質上模仿 Python 解決方案中發送的數據包。我想我在這里主要是在理解字符數據類型方面遇到困難,因為我從未真正使用過它們,我只記得它們很重要,因為具有單位位內存大小。
查看完整描述

1 回答

?
30秒到達戰場

TA貢獻1828條經驗 獲得超6個贊

最直接的解決辦法:


std::vector<signed char> make_byte_array(std::vector<signed char> array) const

{

    array.push_back('\n');

    array.push_back('\r');

    return array;

}

發生了什么:array按值傳遞,因此會自動復制。我們利用此復制來消除在函數內部手動復制的需要。然后我們附加換行符和回車符并返回結果vector。


要獲取存儲在向量內的數組,請使用 vector的data方法


signed char * data = result_vector.data();

或者在 c++11 之前的世界中,我從未見過這個技巧不起作用:


signed char * data = &result_vector[0];

那么……出了什么問題?在 C++ 中返回數組很困難。與 C++ 中的其他所有內容不同,由于Array Decay ,數組默認通過引用傳遞。retval衰減為一個指針,該指針被返回,并retval超出范圍并被銷毀,留下一個指向無效內存的指針。


查看完整回答
反對 回復 2023-07-11
  • 1 回答
  • 0 關注
  • 251 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號