Glib数字转换:如何实现guint64与glong数组的双向转换?
实现guint64与glong数组的双向转换
当然可以实现这种转换!本质上就是把64位整数的内存数据按glong的长度拆分重组,下面我用C语言结合GLib的类型给你具体演示完整的实现方案:
1. 将guint64转换为glong数组
我们可以直接通过内存拷贝的方式,把guint64的字节内容拆分到glong数组中——因为guint64固定是8字节,而glong的长度取决于系统(32位系统是4字节,64位系统是8字节),所以数组的长度就是sizeof(guint64)/sizeof(glong):
#include <glib.h> #include <string.h> // 将guint64转换为glong数组,返回数组的元素个数 gint guint64_to_glong_array(guint64 value, glong **out_array) { // 计算需要的数组长度 gint array_len = sizeof(guint64) / sizeof(glong); // 分配内存存储数组 *out_array = g_malloc(array_len * sizeof(glong)); // 直接拷贝内存内容,完成拆分 memcpy(*out_array, &value, sizeof(guint64)); return array_len; }
2. 将glong数组转换回guint64
逆向转换的逻辑完全对称:把数组的内存内容拷贝回guint64变量即可,不过要确保数组的总字节数和guint64一致,避免数据错误:
// 将glong数组转换回guint64,需传入数组长度(必须和转换时的长度匹配) guint64 glong_array_to_guint64(glong *array, gint array_len) { // 断言校验:确保数组总长度等于guint64的字节数 g_assert(array_len * sizeof(glong) == sizeof(guint64)); guint64 result; // 拷贝内存内容,完成重组 memcpy(&result, array, sizeof(guint64)); return result; }
3. 完整测试示例
下面是一个测试用例,验证转换前后的数据一致性:
int main() { // 原始64位整数 guint64 original = 0x123456789ABCDEF0; glong *array; gint len = guint64_to_glong_array(original, &array); // 打印原始值和数组内容 g_print("Original value: 0x%016" G_GINT64_MODIFIER "X\n", original); g_print("Array length: %d\n", len); for (gint i = 0; i < len; i++) { g_print("Array[%d]: 0x%08" G_GINT64_MODIFIER "X\n", i, array[i]); } // 逆向转换并打印恢复后的值 guint64 restored = glong_array_to_guint64(array, len); g_print("Restored value: 0x%016" G_GINT64_MODIFIER "X\n", restored); // 释放内存 g_free(array); return 0; }
运行这个程序,你会看到恢复后的值和原始值完全一致。
关键注意事项
- 字节序兼容性:上面的代码依赖系统的原生字节序(大端/小端),如果需要在不同字节序的系统间传输这个数组,建议先把
guint64转换为网络字节序(用g_htonll()),再拆分;逆向转换时先重组,再用g_ntohll()转换回系统字节序。 - 类型长度校验:一定要确保数组的总字节数等于
guint64的大小,代码里用g_assert()做了校验,实际生产环境也可以加入错误返回逻辑,避免非法输入导致崩溃。 - 内存管理:示例中用
g_malloc()分配数组内存,记得在使用完后用g_free()释放,避免内存泄漏。
内容的提问来源于stack exchange,提问作者Teamol
相关产品推荐
相关产品推荐

