转换宏

转换宏

类型转换

很多时候,GLib、GTK 和其他库允许你以无符号指针的形式将“用户数据”传递给回调。有时你想要传递整数而不是指针。你可以分配一个整数,比如

int *ip = g_new (int, 1);
*ip = 42;

但这不方便,而且在稍后某个时间释放内存也很烦人。

指针的长度至少为 32 位(在 GLib 打算支持的所有平台上)。因此,你可以在一个指针值中存储至少 32 位的整数值。天真地来说,你可能会尝试这样做,但这是不正确的

gpointer p;
int i;
p = (void*) 42;
i = (int) p;

同样,该示例并不正确,不要复制它。

问题在于在某些系统上,你需要这样做

gpointer p;
int i;
p = (void*) (long) 42;
i = (int) (long) p;

GLib 宏 GPOINTER_TO_INT()GINT_TO_POINTER() 等等在每个平台上都做正确的事情。

警告:你不能在整数中存储指针。这在任何方面、形状或形式上都是不可移植的。这些宏只允许在指针中存储整数,并且只保留整数的 32 位;超出 32 位整数范围的值都会被破坏。

GINT_TO_POINTER(value)GPOINTER_TO_INT(value)

将整数填入指针类型,反之亦然。

记住,你不能在整数中存储指针。这在任何方面、形状或形式上都是不可移植的。这些宏只允许在指针中存储整数,并且只保留整数的 32 位;超出 32 位整数范围的值都会被破坏。

GUINT_TO_POINTER(value)GPOINTER_TO_UINT(value)

将无符号整数填入指针类型,反之亦然。

GSIZE_TO_POINTER(value)GPOINTER_TO_SIZE(value)

size_t 填入指针类型,反之亦然。

GTYPE_TO_POINTER(value)GPOINTER_TO_TYPE(value)

GType 填入指针类型,反之亦然。

应当使用这些宏,而不是 GSIZE_TO_POINTER()GPOINTER_TO_SIZE() 来确保可移植性,因为 GType 不能保证与 size_t 相同。

从 2.80 开始

字节序转换

这些宏提供了一种可移植的方法来确定主机字节序和转换不同字节序之间的值。

字节序是存储字节以创建更大数据类型(例如 #gint 和 #glong 值)的顺序。主机字节序是在当前机器上使用的字节序。

一些处理器首先存储最高有效字节(即,保存值最大部分的字节)。这些处理器称为大端处理器。其他处理器(尤其是 x86 系列)最后存储最高有效字节。这些称为小端处理器。

最后,更复杂的问题是,一些其他处理器以称为 PDP-端的一种相当奇怪的顺序存储字节。对于一个 4 字节字,第 3 个最高有效字节首先存储,然后是第 4 个,然后是第 1 个,最后是第 2 个。

显然,当这些不同的处理器通过网络或使用二进制文件格式进行通信时会出现问题。这就是这些宏派上用场的地方。它们通常用于将值转换为在不同处理器之间通信时已同意的字节顺序。互联网将“网络字节顺序”用作标准字节顺序(实际上是大端字节顺序)。

请注意,字节顺序转换宏可能会对它们的参数进行评估多次,因此不应将它们与具有副作用的参数一起使用。

G_BYTE_ORDER

主机字节顺序。它可以是 G_LITTLE_ENDIANG_BIG_ENDIAN

G_LITTLE_ENDIAN

指定小端字节顺序。

G_BIG_ENDIAN

指定大端字节顺序。

G_PDP_ENDIAN

指定 PDP 端字节顺序。

有符号

GINT_FROM_BE(value)

将 `int` 值从大端转换为主机字节顺序。

GINT_FROM_LE(value)

将 `int` 值从小端转换为主机字节顺序。

GINT_TO_BE(value)

将 `int` 值从主机字节顺序转换为大端。

GINT_TO_LE(value)

将 `int` 值从主机字节顺序转换到小端。

GLONG_FROM_BE(value)

将 `long` 值从大端转换为主机字节顺序。

GLONG_FROM_LE(value)

将 `long` 值从小端转换为主机字节顺序。

GLONG_TO_BE(value)

将 `long` 值从主机字节顺序转换为大端。

GLONG_TO_LE(value)

将 `long` 值从主机字节顺序转换到小端。

GSSIZE_FROM_BE(value)

将 `ssize_t` 值从大端转换为主机字节顺序。

GSSIZE_FROM_LE(value)

将 `ssize_t` 值从小端转换为主机字节顺序。

GSSIZE_TO_BE(value)

将 `ssize_t` 值从主机字节顺序转换为大端。

GSSIZE_TO_LE(value)

将 `ssize_t` 值从主机字节顺序转换到小端。

GINT16_FROM_BE(value)

将 `int16_t` 值从大端转换为主机字节顺序。

GINT16_FROM_LE(value)

将 `int16_t` 值从小端转换为主机字节顺序。

GINT16_TO_BE(value)

将 `int16_t` 值从主机字节顺序转换为大端。

GINT16_TO_LE(value)

将 `int16_t` 值从主机字节顺序转换到小端。

GINT32_FROM_BE(value)

将 `int32_t` 值从大端转换为主机字节顺序。

GINT32_FROM_LE(value)

将 `int32_t` 值从小端转换为主机字节顺序。

GINT32_TO_BE(value)

将 `int32_t` 值从主机字节顺序转换为大端。

GINT32_TO_LE(value)

将一个 int32_t 值从主机字节顺序转换为小端序。

GINT64_FROM_BE(value)

将一个 int64_t 値从大端序转换为主机字节顺序。

GINT64_FROM_LE(value)

将一个 int64_t 値从小端序转换为主机字节顺序。

GINT64_TO_BE(value)

将一个 int64_t 值从主机字节顺序转换为大端序。

GINT64_TO_LE(value)

将一个 int64_t 值从主机字节顺序转换为小端序。

无符号类型

GUINT_FROM_BE(value)

将一个 unsigned int 值从大端序转换为主机字节顺序。

GUINT_FROM_LE(value)

将一个 unsigned int 值从小端序转换为主机字节顺序。

GUINT_TO_BE(value)

将一个 unsigned int 值从主机字节顺序转换为大端序。

GUINT_TO_LE(value)

将一个 unsigned int 值从主机字节顺序转换为小端序。

GULONG_FROM_BE(value)

将一个 unsigned long 值从大端序转换为主机字节顺序。

GULONG_FROM_LE(value)

将一个 unsigned long 值从小端序转换为主机字节顺序。

GULONG_TO_BE(value)

将一个 unsigned long 值从主机字节顺序转换为大端序。

GULONG_TO_LE(value)

将一个 unsigned long 值从主机字节顺序转换为小端序。

GSIZE_FROM_BE(value)

将一个 size_t 值从大端序转换为主机字节顺序。

GSIZE_FROM_LE(value)

将一个 size_t 值从小端序转换为主机字节顺序。

GSIZE_TO_BE(value)

将一个 size_t 值从主机字节顺序转换为大端序。

GSIZE_TO_LE(value)

将一个 size_t 值从主机字节顺序转换为小端序。

GUINT16_FROM_BE(value)

将一个 uint16_t 值从大端序转换为主机字节顺序。

GUINT16_FROM_LE(value)

将一个 uint16_t 值从小端序转换为主机字节顺序。

GUINT16_TO_BE(value)

将一个 uint16_t 值从主机字节顺序转换为大端序。

GUINT16_TO_LE(value)

将一个 uint16_t 值从主机字节顺序转换为小端序。

GUINT32_FROM_BE(value)

将一个 uint32_t 值从大端序转换为主机字节顺序。

GUINT32_FROM_LE(value)

将一个 uint32_t 值从小端序转换为主机字节顺序。

GUINT32_TO_BE(value)

将一个 uint32_t 值从主机字节顺序转换为大端序。

GUINT32_TO_LE(value)

将一个 uint32_t 值从主机字节顺序转换为小端序。

GUINT64_FROM_BE(value)

将一个 uint64_t 值从大端序转换为主机字节顺序。

GUINT64_FROM_LE(value)

将一个 uint64_t 值从小端序转换为主机字节顺序。

GUINT64_TO_BE(value)

uint64_t 值从主机字节顺序转换为大端字节序。

GUINT64_TO_LE(value)

uint64_t 值从主机字节顺序转换为小端字节序。

GUINT16_SWAP_BE_PDP(value)

uint16_t 值在大端字节序和 PDP 端字节序之间进行转换。转换是对称的,因此可以同时用于这两种字节序。

GUINT16_SWAP_LE_BE(value)

uint16_t 值在小端字节序和大端字节序之间进行转换。转换是对称的,因此可以同时用于这两种字节序。

GUINT16_SWAP_LE_PDP(value)

uint16_t 值在小端字节序和 PDP 端字节序之间进行转换。转换是对称的,因此可以同时用于这两种字节序。

GUINT32_SWAP_BE_PDP(value)

uint32_t 值在大端字节序和 PDP 端字节序之间进行转换。转换是对称的,因此可以同时用于这两种字节序。

GUINT32_SWAP_LE_BE(value)

uint32_t 值在小端字节序和大端字节序之间进行转换。转换是对称的,因此可以同时用于这两种字节序。

GUINT32_SWAP_LE_PDP(value)

uint32_t 值在小端字节序和 PDP 端字节序之间进行转换。转换是对称的,因此可以同时用于这两种字节序。

GUINT64_SWAP_LE_BE(value)

uint64_t 值在小端字节序和大端字节序之间进行转换。转换是对称的,因此可以同时用于这两种字节序。