我有下面的代碼,以獲取有關TCP端口的信息:轉換[UINT8]數組來xinpgen結構
var length = 0
if (sysctlbyname("net.inet.tcp.pcblist", nil, &length, nil, 0) < 0)
{
perror("sysctlbyname")
}
else
{
var buffer: [UInt8] = [UInt8](repeating: 0, count: Int(length))
sysctlbyname("net.inet.tcp.pcblist", &buffer, &length, nil, 0)
}
我現在想的緩衝區轉換成一些更「有用」。我讀過返回值是一個名爲「xinpgen」的結構。 如何將緩衝區轉換爲該結構?
我嘗試下面的代碼直接寫結果到結構體變量:
var length = 0
if (sysctlbyname("net.inet.tcp.pcblist", nil, &length, nil, 0) < 0)
{
perror("sysctlbyname")
}
else
{
var input = xinpgen()
sysctlbyname("net.inet.tcp.pcblist", &input, &length, nil, 0)
}
本身並沒有失敗,調用似乎是成功的。該變量包含一些不爲零的數據。但不久後在通話結束後,程序繼續執行,應用程序崩潰:
error: memory read failed for 0x0
如何使用緩衝區來填充結構體變量?爲什麼第二次通話失敗?
這顯然沒有C代碼。 – Olaf
這是Swift,但我想將「Swift對象」轉換爲C結構。 –
「我想將」Swift對象「轉換爲C結構」 - 不完全。你想將一個swift對象轉換成符合你的平臺的C ** ABI **的內存塊。這與C語言無關,而是一個純粹的快速問題。 – Olaf