第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

如何將 python 字節(jié)數(shù)組追加轉(zhuǎn)換為 C++

如何將 python 字節(jié)數(shù)組追加轉(zhuǎn)換為 C++

白板的微信 2023-07-11 17:15:26
我對(duì) ROS 和嵌入式 C++ 編程非常非常陌生。我討厭 Python,我希望將最初用 Python 編寫的節(jié)點(diǎn)轉(zhuǎn)換為 C++。我不會(huì)詳細(xì)介紹這種轉(zhuǎn)換,我對(duì)我采用的 OOP 方法很滿意(將訂閱者回調(diào)放入類中,將發(fā)布者作為類成員),但主要問題是 python 中處理所需字節(jié)數(shù)組的一段代碼用于與 Arduino 進(jìn)行通信。我從未在 C++ 中使用過字節(jié)和位,事實(shí)證明人們使用 Python 是因?yàn)槠溆押玫?Pyserial 庫,而 C++ 中的等效方法非常黑暗,特別是在 Linux 操作系統(tǒng)上。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,將實(shí)際數(shù)據(jù)從該消息傳遞到數(shù)組 my_array,現(xiàn)在該數(shù)組中的元素被讀取為 ASCI 而不是位,因此 for 循環(huán)將 48 添加到中的每個(gè)元素為了得到他們的十進(jìn)制值。最后兩個(gè)附加是 Arduino 中需要的一些特殊字節(jié)。在 C++ 中我不知道如何做到這一點(diǎn)。我在這里找到了說明并創(chuàng)建了一個(gè) SerialComm 類,它本質(zhì)上模仿了該代碼,該類中最重要的方法應(yīng)該是:void SerialComm::write_port(unsigned char* msg){   int i=write(serial_port, msg, sizeof(msg));}我不確定參數(shù)是否應(yīng)該具有 unsigned char* 數(shù)據(jù)類型,但似乎 unistd.h 中的 write 函數(shù)支持這一點(diǎn)??偟膩碚f,我如何準(zhǔn)備“數(shù)據(jù)包”并將其發(fā)送到端口?更具體地說,我需要寫入的數(shù)據(jù)是ROS中的std_msgs/ByteMultiArray類型,我檢查了它,實(shí)際數(shù)據(jù)是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; }這個(gè)函數(shù)顯然是無意義的,但是它編譯了,它自然不起作用,因?yàn)榉祷亓?retval 變量的地址,沒有其他任何東西,但我主要試圖以某種方式將 unsigned char* 傳遞給該 write 函數(shù)以將數(shù)據(jù)寫入端口。當(dāng)然,主要問題是如何將從 std_msgs/ByteMultiArray 獲得的 std::vector 數(shù)組轉(zhuǎn)換為寫入 arduino 端口所需的任何內(nèi)容,并本質(zhì)上模仿 Python 解決方案中發(fā)送的數(shù)據(jù)包。我想我在這里主要是在理解字符數(shù)據(jù)類型方面遇到困難,因?yàn)槲覐奈凑嬲褂眠^它們,我只記得它們很重要,因?yàn)榫哂袉挝晃粌?nèi)存大小。
查看完整描述

1 回答

?
30秒到達(dá)戰(zhàn)場(chǎng)

TA貢獻(xiàn)1828條經(jīng)驗(yàn) 獲得超6個(gè)贊

最直接的解決辦法:


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

{

    array.push_back('\n');

    array.push_back('\r');

    return array;

}

發(fā)生了什么:array按值傳遞,因此會(huì)自動(dòng)復(fù)制。我們利用此復(fù)制來消除在函數(shù)內(nèi)部手動(dòng)復(fù)制的需要。然后我們附加換行符和回車符并返回結(jié)果vector。


要獲取存儲(chǔ)在向量內(nèi)的數(shù)組,請(qǐng)使用 vector的data方法


signed char * data = result_vector.data();

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


signed char * data = &result_vector[0];

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


查看完整回答
反對(duì) 回復(fù) 2023-07-11
  • 1 回答
  • 0 關(guān)注
  • 264 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)