求助C.GoBytes这个cgo函数的用法,踩了一个大写的坑,跪求求解答

jan-bar · · 3114 次点击 · 开始浏览    置顶
这是一个创建于 的主题,其中的信息可能已经有所发展或是发生改变。

``` 大神们怎么使用C.GoBytes的啊?今天我想练习使用cgo用go获取c语言返回的数据, 因为有些工具是C语言实现的,所以只能用cgo来搞了。 但是我发现下面这个测试程序有问题,我读取了一个windows文件及行尾包含CRLF而不是Linux的LF 然后我发现返回给go的数据中CR字符全部丢失,下面是代码: ``` ```go package main /* #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> int read_file(const char *fr,const char *fw,unsigned char **outData) { struct stat statbuf; stat(fr,&statbuf); int size = statbuf.st_size; *outData = (unsigned char*)malloc(sizeof(unsigned char)*size); int fd = open(fr,O_RDONLY); if (fd < 0) return -1; size = read(fd,*outData,size); if (size < 0) return -1; close(fd); fd = open(fw,O_WRONLY|O_CREAT); write(fd,*outData,size); close(fd); return size; } */ import "C" import ( "io/ioutil" "os" "unsafe" ) func main() { if len(os.Args) != 2 { return } var ( fr = C.CString(os.Args[1]) fw = C.CString(os.Args[1] + ".in.c") outData *C.uchar size = C.read_file(fr, fw, &outData) byt = C.GoBytes(unsafe.Pointer(outData), size) ) defer func() { C.free(unsafe.Pointer(fr)) C.free(unsafe.Pointer(fw)) C.free(unsafe.Pointer(outData)) }() ioutil.WriteFile(os.Args[1]+".in.go", byt, 0666) } ``` ``` 这是我的测试文件,windows换行为0d0a表示CRLF,执行:.\test a.txt后产生2个文件,下面是3个文件的内容 # xxd a.txt 00000000: 310d 0a32 0d0a 330d 0a 1..2..3.. # xxd a.txt.in.c 00000000: 310d 0a32 0d0a 330d 0a 1..2..3.. # xxd a.txt.in.go 00000000: 310a 320a 330a 1.2.3. 我发现返回go的数据写入文件会丢失所有0D字符,大写的问号,求助大神解释解释。我Google查了,没有头绪啊。 已经验证过不是go写文件丢失,而是C.GoBytes返回的byt已经丢失了0D字符。不明觉厉。 ```

有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

3114 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传