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

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

如何通過 CGO 從 C 函數中的內部 void * 返回 []byte?

如何通過 CGO 從 C 函數中的內部 void * 返回 []byte?

Go
尚方寶劍之說 2023-03-29 16:06:01
我用以下定義包裝了一個 C 函數:int parser_shift(parser* parser, void* buffer, int length);它從未解析字節的內部緩沖區中刪除最多 length 個字節,并將它們存儲在給定的緩沖區中?,F在我希望將它包裝成一個具有以下定義的 Go 函數:func (p *Parser) Shift() []byte {    var buffer []byte    // TODO:    return buffer}用CGO完成上面的TODO,正確的寫法是什么?我嘗試了以下方法,但它因錯誤而崩潰:“/path/to/my/program”中的錯誤:free():下一個大小無效(快速):0x00007f8fe0000aa0:var buffer []bytebufStr := C.CString(string(buffer))defer C.free(unsafe.Pointer(bufStr))C.parser_shift(p.Cparser, unsafe.Pointer(bufStr), C.int(8192))buffer = []byte(C.GoString(bufStr))return buffer
查看完整描述

2 回答

?
www說

TA貢獻1775條經驗 獲得超8個贊

假設您的parser_shift函數返回實際存儲在緩沖區中的字節數,您可以這樣做:


func (p *Parser) Shift() []byte {

    var buffer [8192]byte

    parsed := int(C.parser_shift(p.Cparser, unsafe.Pointer(&buffer[0]), C.int(len(buffer))))

    return buffer[:parsed]

}

無需與字符串相互轉換,只需將它傳遞給您希望它寫入的內存即可。


查看完整回答
反對 回復 2023-03-29
?
慕俠2389804

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

試試這個功能


// C pointer, length to Go []byte

func C.GoBytes(unsafe.Pointer, C.int) []byte


查看完整回答
反對 回復 2023-03-29
  • 2 回答
  • 0 關注
  • 193 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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