【发布时间】:2020-11-10 13:08:44
【问题描述】:
为了理解这一点,我想讲述以下场景: 我设计了一个游戏并完成了它。我用 AES 加密了音频数据。然后我将在游戏打开时解密这些加密文件。这些文件在内存中以字节编码。 例如,我想为 OpenAL 创建缓冲区。
注意:这里没有加密功能。因为我的例子会很复杂很困难。
这是我想用 CGo 和 Go 做什么的简单草图:
package main
// #cgo windows CFLAGS: -DGO_WINDOWS -I.
// #cgo windows LDFLAGS: -L. -lsndfile-1
/*
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <math.h>
#include <string.h>
#include <errno.h>
#include "sndfile.h"
typedef struct {
sf_count_t offset, length ;
unsigned char data [16 * 1024] ;
} VIO_DATA;
static sf_count_t
vfget_filelen(void *user_data) {
VIO_DATA *vf = (VIO_DATA *) user_data;
return vf->length;
}
static sf_count_t
vfseek(sf_count_t offset, int whence, void *user_data) {
VIO_DATA *vf = (VIO_DATA *) user_data ;
switch (whence) {
case SEEK_SET :
vf->offset = offset ;
break ;
case SEEK_CUR :
vf->offset = vf->offset + offset ;
break ;
case SEEK_END :
vf->offset = vf->length + offset ;
break ;
default :
break ;
};
return vf->offset;
}
static sf_count_t
vfread (void *ptr, sf_count_t count, void *user_data) {
VIO_DATA *vf = (VIO_DATA *) user_data ;
if (vf->offset + count > vf->length)
count = vf->length - vf->offset ;
memcpy (ptr, vf->data + vf->offset, count) ;
vf->offset += count ;
return count ;
}
static sf_count_t
vfwrite (const void *ptr, sf_count_t count, void *user_data) {
VIO_DATA *vf = (VIO_DATA *) user_data ;
if(vf->offset >= sizeof(vf->data))
return 0;
if (vf->offset + count > sizeof(vf->data))
count = sizeof (vf->data) - vf->offset;
memcpy(vf->data + vf->offset, ptr, (size_t) count);
vf->offset += count;
if(vf->offset > vf->length)
vf->length = vf->offset ;
return count;
}
static sf_count_t
vftell(void *user_data) {
VIO_DATA *vf = (VIO_DATA *) user_data ;
return vf->offset;
}
void voidTest(void *data) {
printf("value in c: %s \n", (char*)data);
static VIO_DATA vio_data ;
// static short fdata [256];
SF_VIRTUAL_IO vio ;
SNDFILE * file ;
SF_INFO sfinfo ;
vio.get_filelen = vfget_filelen;
vio.seek = vfseek ;
vio.read = vfread;
vio.write = vfwrite;
vio.tell = vftell;
vio_data.offset = 0;
vio_data.length = 0;
memset (&sfinfo, 0, sizeof (sfinfo));
sfinfo.format = SF_FORMAT_WAV | SF_FORMAT_PCM_16;
if((file = sf_open_virtual (&vio, SFM_READ, &sfinfo, &vio_data)) == NULL) {
printf("Sndfile error: %s\n", sf_strerror(file));
exit(1);
// return;
}
// !As an example I want to know the number of channels etc.
printf("Channel: %i\n", sfinfo.channels);
sf_close(file);
}
*/
import "C"
import (
"io/ioutil"
"fmt"
"unsafe"
)
func main() {
byt, err := ioutil.ReadFile("birds22.wav")
if err != nil {
fmt.Println(err)
return
}
var v unsafe.Pointer
v = (unsafe.Pointer)(&byt[0])
C.voidTest(v)
// fmt.Println("byte:", string(byt))
fmt.Println("No crash: test successfuly")
}
项目文件夹:
- main.go
- birds22.wav
- libsndfile-1.dll
- sndfile.h
我的构建命令:go build .
我不是经验丰富的 C 开发人员。这就是我与 CGo 合作的原因。但我会尝试使 C 代码适应 CGO,这说明了如何做到这一点。
我使用的来源和我尝试调整的代码: libsndfile virtualio test gosndfile virtualio test
【问题讨论】:
-
"我用 AES 加密了音频数据。" ——但是为什么?
-
我不希望未经许可使用我的音频数据。这些声音是我买来并精心设计的。此外,其他游戏公司也会加密他们的数据。
-
除非您有一些非常可靠的 DRM,否则简单地加密数据是浪费时间。如果你有可靠的 DRM,你就不会在 SO 上问这个级别的问题。 ://
-
我不这么认为。我知道很多项目都是这样工作的。如果我认为这些步骤还不够,我可以创建不同的文件格式。但我会再次谈到同样的话题。最终我必须用 libsndfile 处理这些文件。
-
嗯,这是你的项目。所以做你想做的。但我不会浪费我的时间。
标签: c go cgo libsndfile