サイズ=各フィールドのバイト数(x64/x86 で異なる場合は x64/x86 と併記)。x64/x86 列=フィールドのバイトオフセット(HSPで dupptr / lpoke / wpoke 等に使用)。
コピー #include <windows.h>
// IN_ADDR (x64 8 / x86 4 バイト)
typedef struct IN_ADDR {
_S_un_e__Union S_un;
} IN_ADDR;
// IPV4_HEADER (x64 56 / x86 28 バイト)
typedef struct IPV4_HEADER {
_Anonymous1_e__Union Anonymous1;
_Anonymous2_e__Union Anonymous2;
WORD TotalLength;
WORD Identification;
_Anonymous3_e__Union Anonymous3;
BYTE TimeToLive;
BYTE Protocol;
WORD HeaderChecksum;
IN_ADDR SourceAddress;
IN_ADDR DestinationAddress;
} IPV4_HEADER;コピー using System;
using System.Runtime.InteropServices;
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct IN_ADDR
{
public _S_un_e__Union S_un;
}
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct IPV4_HEADER
{
public _Anonymous1_e__Union Anonymous1;
public _Anonymous2_e__Union Anonymous2;
public ushort TotalLength;
public ushort Identification;
public _Anonymous3_e__Union Anonymous3;
public byte TimeToLive;
public byte Protocol;
public ushort HeaderChecksum;
public IN_ADDR SourceAddress;
public IN_ADDR DestinationAddress;
}コピー Imports System.Runtime.InteropServices
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure IN_ADDR
Public S_un As _S_un_e__Union
End Structure
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure IPV4_HEADER
Public Anonymous1 As _Anonymous1_e__Union
Public Anonymous2 As _Anonymous2_e__Union
Public TotalLength As UShort
Public Identification As UShort
Public Anonymous3 As _Anonymous3_e__Union
Public TimeToLive As Byte
Public Protocol As Byte
Public HeaderChecksum As UShort
Public SourceAddress As IN_ADDR
Public DestinationAddress As IN_ADDR
End Structureコピー import ctypes
from ctypes import wintypes
class IN_ADDR(ctypes.Structure):
_fields_ = [
("S_un", _S_un_e__Union),
]
class IPV4_HEADER(ctypes.Structure):
_fields_ = [
("Anonymous1", _Anonymous1_e__Union),
("Anonymous2", _Anonymous2_e__Union),
("TotalLength", ctypes.c_ushort),
("Identification", ctypes.c_ushort),
("Anonymous3", _Anonymous3_e__Union),
("TimeToLive", ctypes.c_ubyte),
("Protocol", ctypes.c_ubyte),
("HeaderChecksum", ctypes.c_ushort),
("SourceAddress", IN_ADDR),
("DestinationAddress", IN_ADDR),
]コピー #[repr(C)]
pub struct IN_ADDR {
pub S_un: _S_un_e__Union,
}
#[repr(C)]
pub struct IPV4_HEADER {
pub Anonymous1: _Anonymous1_e__Union,
pub Anonymous2: _Anonymous2_e__Union,
pub TotalLength: u16,
pub Identification: u16,
pub Anonymous3: _Anonymous3_e__Union,
pub TimeToLive: u8,
pub Protocol: u8,
pub HeaderChecksum: u16,
pub SourceAddress: IN_ADDR,
pub DestinationAddress: IN_ADDR,
}コピー import "golang.org/x/sys/windows"
type IN_ADDR struct {
S_un _S_un_e__Union
}
type IPV4_HEADER struct {
Anonymous1 _Anonymous1_e__Union
Anonymous2 _Anonymous2_e__Union
TotalLength uint16
Identification uint16
Anonymous3 _Anonymous3_e__Union
TimeToLive byte
Protocol byte
HeaderChecksum uint16
SourceAddress IN_ADDR
DestinationAddress IN_ADDR
}コピー type
IN_ADDR = record
S_un: _S_un_e__Union;
end;
IPV4_HEADER = record
Anonymous1: _Anonymous1_e__Union;
Anonymous2: _Anonymous2_e__Union;
TotalLength: Word;
Identification: Word;
Anonymous3: _Anonymous3_e__Union;
TimeToLive: Byte;
Protocol: Byte;
HeaderChecksum: Word;
SourceAddress: IN_ADDR;
DestinationAddress: IN_ADDR;
end;コピー const IN_ADDR = extern struct {
S_un: _S_un_e__Union,
};
const IPV4_HEADER = extern struct {
Anonymous1: _Anonymous1_e__Union,
Anonymous2: _Anonymous2_e__Union,
TotalLength: u16,
Identification: u16,
Anonymous3: _Anonymous3_e__Union,
TimeToLive: u8,
Protocol: u8,
HeaderChecksum: u16,
SourceAddress: IN_ADDR,
DestinationAddress: IN_ADDR,
};コピー type
IN_ADDR {.bycopy.} = object
S_un: _S_un_e__Union
IPV4_HEADER {.bycopy.} = object
Anonymous1: _Anonymous1_e__Union
Anonymous2: _Anonymous2_e__Union
TotalLength: uint16
Identification: uint16
Anonymous3: _Anonymous3_e__Union
TimeToLive: uint8
Protocol: uint8
HeaderChecksum: uint16
SourceAddress: IN_ADDR
DestinationAddress: IN_ADDRコピー struct IN_ADDR
{
_S_un_e__Union S_un;
}
struct IPV4_HEADER
{
_Anonymous1_e__Union Anonymous1;
_Anonymous2_e__Union Anonymous2;
ushort TotalLength;
ushort Identification;
_Anonymous3_e__Union Anonymous3;
ubyte TimeToLive;
ubyte Protocol;
ushort HeaderChecksum;
IN_ADDR SourceAddress;
IN_ADDR DestinationAddress;
}HSP3.7/3.8 は構造体機能が無いため4byte整数配列(dim)+peek/poke で操作(32/64bitでサイズ・位置が異なる場合はタブで分割)。IronHSP は NSTRUCT (#defstruct/stdim/->)で32/64bit共通。
コピー ; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x86 レイアウト)
; IPV4_HEADER サイズ: 28 バイト(x86)
dim st, 7 ; 4byte整数×7(構造体サイズ 28 / 4 切り上げ)
; Anonymous1 : _Anonymous1_e__Union (+0, 4byte) varptr(st)+0 を基点に操作(4byte:入れ子/配列)
; Anonymous2 : _Anonymous2_e__Union (+4, 4byte) varptr(st)+4 を基点に操作(4byte:入れ子/配列)
; TotalLength : WORD (+8, 2byte) wpoke st,8,値 / 値 = wpeek(st,8)
; Identification : WORD (+10, 2byte) wpoke st,10,値 / 値 = wpeek(st,10)
; Anonymous3 : _Anonymous3_e__Union (+12, 4byte) varptr(st)+12 を基点に操作(4byte:入れ子/配列)
; TimeToLive : BYTE (+16, 1byte) poke st,16,値 / 値 = peek(st,16)
; Protocol : BYTE (+17, 1byte) poke st,17,値 / 値 = peek(st,17)
; HeaderChecksum : WORD (+18, 2byte) wpoke st,18,値 / 値 = wpeek(st,18)
; SourceAddress : IN_ADDR (+20, 4byte) varptr(st)+20 を基点に操作(4byte:入れ子/配列)
; DestinationAddress : IN_ADDR (+24, 4byte) varptr(st)+24 を基点に操作(4byte:入れ子/配列)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。コピー ; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; IPV4_HEADER サイズ: 56 バイト(x64)
dim st, 14 ; 4byte整数×14(構造体サイズ 56 / 4 切り上げ)
; Anonymous1 : _Anonymous1_e__Union (+0, 8byte) varptr(st)+0 を基点に操作(8byte:入れ子/配列)
; Anonymous2 : _Anonymous2_e__Union (+8, 8byte) varptr(st)+8 を基点に操作(8byte:入れ子/配列)
; TotalLength : WORD (+16, 2byte) wpoke st,16,値 / 値 = wpeek(st,16)
; Identification : WORD (+18, 2byte) wpoke st,18,値 / 値 = wpeek(st,18)
; Anonymous3 : _Anonymous3_e__Union (+24, 8byte) varptr(st)+24 を基点に操作(8byte:入れ子/配列)
; TimeToLive : BYTE (+32, 1byte) poke st,32,値 / 値 = peek(st,32)
; Protocol : BYTE (+33, 1byte) poke st,33,値 / 値 = peek(st,33)
; HeaderChecksum : WORD (+34, 2byte) wpoke st,34,値 / 値 = wpeek(st,34)
; SourceAddress : IN_ADDR (+40, 8byte) varptr(st)+40 を基点に操作(8byte:入れ子/配列)
; DestinationAddress : IN_ADDR (+48, 8byte) varptr(st)+48 を基点に操作(8byte:入れ子/配列)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。コピー ; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
; ※GUID・入れ子構造体はデフォルト型でないため、依存する #defstruct を先に定義(下記に同梱)。
#defstruct global IN_ADDR
#field byte S_un 8
#endstruct
#defstruct global IPV4_HEADER
#field byte Anonymous1 8
#field byte Anonymous2 8
#field short TotalLength
#field short Identification
#field byte Anonymous3 8
#field byte TimeToLive
#field byte Protocol
#field short HeaderChecksum
#field IN_ADDR SourceAddress
#field IN_ADDR DestinationAddress
#endstruct
stdim st, IPV4_HEADER ; NSTRUCT 変数を確保
st->TotalLength = 100
mes "TotalLength=" + st->TotalLength
; ※union フィールドは byte 列で確保(NSTRUCT は union 非対応)。必要に応じ手動でアクセス。