You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 10:36:50