```
大神们怎么使用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字符。不明觉厉。
```
有疑问加站长微信联系(非本文作者)