duan205571 2014-09-10 22:14
浏览 88
已采纳

从Go代码修改C void *字节数组

Basically, I'm trying to replace pread in a C program with a Go function. I've got most of the structure working, but I can't figure out how to populate the buffer argument (buf unsafe.Pointer) with the desired bytes.

Part of daemon.c:

static int preadShim(int fd, void *buf, size_t count, off_t offset) {
    //return pread(fd, buf, count, offset);
    return ReadOver(fd, buf, count, offset);
}

In a Golang file:

package main

import "C"
import "fmt"
import "unsafe"

//export ReadOver
func ReadOver(fd C.int, buf unsafe.Pointer, count C.int, offset C.int) C.int{
    fmt.Println("ReadOver got called")  
    newBuf := []byte("injected bytes")
    //TODO: copy newBuf over buf
    return count
}

Another Golang file:

package main

// #include "daemon.c"
import "C"
import "fmt"

func main() {
    //Start C program
    C.start()
}

Any suggestions? I've tried nothing and I'm all out of ideas.

  • 写回答

1条回答 默认 最新

  • duanhe1976 2014-09-10 22:23
    关注

    You just have to create your own slice from it, for example:

    func ReadOver(fd C.int, buf unsafe.Pointer, count C.int, offset C.int) C.int {
        fmt.Println("ReadOver got called")
        newBuf := []byte("injected bytes")
        slice := &reflect.SliceHeader{Data: uintptr(buf), Len: int(count), Cap: int(count)}
        rbuf := *(*[]byte)(unsafe.Pointer(slice))
        return C.int(copy(rbuf, newBuf))
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥50 切换TabTip键盘的输入法
  • ¥15 可否在不同线程中调用封装数据库操作的类
  • ¥15 微带串馈天线阵列每个阵元宽度计算
  • ¥15 keil的map文件中Image component sizes各项意思
  • ¥20 求个正点原子stm32f407开发版的贪吃蛇游戏
  • ¥15 划分vlan后,链路不通了?
  • ¥20 求各位懂行的人,注册表能不能看到usb使用得具体信息,干了什么,传输了什么数据
  • ¥15 Vue3 大型图片数据拖动排序
  • ¥15 Centos / PETGEM
  • ¥15 划分vlan后不通了