将 C 结构读入 Go 结构

问题描述 投票:0回答:0

我正在尝试将 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 数据。
所有类型看起来都一样。
这里有什么问题?
谢谢。

c go dll system system-calls
© www.soinside.com 2019 - 2024. All rights reserved.