我正在尝试将 C 结构读入 Go 结构。 我对 DLL 库中的函数使用系统调用并获取其返回值。
func LoadWAV(file string, spec *m.AudioSpec, audioBuf **uint8, audioLen *uint32) *m.AudioSpec {
// #define SDL_LoadWAV(file, spec, audio_buf, audio_len) SDL_LoadWAV_RW(SDL_RWFromFile(file, "rb"),1, spec,audio_buf,audio_len)
// This is a C macro.
// This means, it is not directly accessible via the DLL file !
ops := RWFromFile(file, "rb")
if ops == 0 {
panic(ops)
}
ret, _, _ := syscall.SyscallN(fnLoadWAV_RW, ops, 0, uintptr(unsafe.Pointer(spec)), uintptr(unsafe.Pointer(audioBuf)), uintptr(unsafe.Pointer(audioLen)))
return (*m.AudioSpec)(unsafe.Pointer(ret))
}
两个简单的字段(
audioBuf
和audioLen
)被正确读取,但是spec
在C和Go中是不同的
这里是这个类型在C中的原始定义:
typedef struct SDL_AudioSpec
{
int freq;
SDL_AudioFormat format;
Uint8 channels;
Uint8 silence;
Uint16 samples;
Uint16 padding;
Uint32 size;
SDL_AudioCallback callback;
void *userdata;
} SDL_AudioSpec;
typedef Uint16 SDL_AudioFormat;
typedef void (SDLCALL * SDL_AudioCallback) (void *userdata, Uint8 * stream, int len);
我在C中看到的对象值如下
(我使用 JetBrains 的 CLion 和 VisualStudio 工具链)
wavSpec = {SDL_AudioSpec} {freq=44100, format=32784, channels=2 '\x2', ...}
freq = {int} 44100
format = {unsigned short} 32784
channels = {unsigned char} 2 '\x2'
silence = {unsigned char} 0 '\0'
samples = {unsigned short} 4096
padding = {unsigned short} 0
size = {unsigned int} 0
callback = {void (*)(void *, unsigned char *, int)} NULL
userdata = {void *} NULL
这里是这个类型在 Go 中的定义。
所有领域都等于我的眼睛。
type AudioSpec struct {
Freq uint16
Format AudioFormat
Channels uint8
Silence uint8
Samples uint16
Padding uint16
Size uint32
Callback AudioCallback
Userdata *byte
}
type AudioFormat uint16
type AudioCallback func(userdata *byte, stream *uint8, len uint16)
Go中接收到的对象值部分损坏:
wavSpec = {m.AudioSpec}
Freq = {uint16} 44100
Format = {m.AudioFormat} 0
Channels = {uint8} 16
Silence = {uint8} 128
Samples = {uint16} 2
Padding = {uint16} 4096
Size = {uint32} 0
Callback = {m.AudioCallback} nil
Userdata = {uintptr} 0
第一个字段,
Freq
,在 C 和 Go 中是相等的,但是接下来的所有字段都损坏了。
这是我第一次尝试在 Golang 中使用 C 数据。
所有类型看起来都一样。
这里有什么问题?
谢谢。