【问题标题】:How do I parse a decimal UUID string in C?如何在 C 中解析十进制 UUID 字符串?
【发布时间】:2011-02-23 21:13:34
【问题描述】:

我有一个表示为十进制数的 UUID(128 位数字),我需要将其解析为 C 中的数字形式。我的目标数据结构是 char[16],使用 bignum 库不是选项。有人能指出一个合适的算法吗?

【问题讨论】:

  • 当您使用 uuids 时,您将使用 RPC。你肯定有一个运行时支持库。辅助函数的通用名称是 UuidFromString。
  • 这将解析正常格式的 uuid(aaaabbbb-cccc-dddd-eeee-ffffgggghhhh,十六进制)。 “表示为十进制数”不是正常格式。
  • 你有一个包含十进制表示的字符串?这个是从哪里来的?我要投诉!
  • 这是针对 ASN.1 OID 解析器的。 {joint-iso-itu-t(2) uuid(25)} OID 弧允许注册 UUID,但 ASN.1 要求弧 ID 的十进制表示。因此,例如,UUID 为 3be753a0-051d-11de-8329-0002a5d5c51b 的“motorola”弧显示为 {joint-iso-itu-t(2) uuid(25) motorola(79625568443717255337188391839044322587)}
  • 这个问题以前在这里被问过。看看:stackoverflow.com/questions/2652760

标签: c algorithm parsing string bignum


【解决方案1】:

朴素算法非常简单:

char number[] = "79625568443717255337188391839044322587";
unsigned char uuid[16] = { 0 };

for (char* n = number; *n; n++) {
    unsigned c = *n - '0';
    for (int i = 0; i < 16; i++) {
        c += uuid[i] * 10;
        uuid[i] = c % 256;
        c /= 256;
    }
}

这比典型的 bignum 操作更简单,因为乘数 10 小于单元大小并且数字长度是固定的。

只要c 仍然更大(例如uint64_t),您可以通过使用比 char 更大的单位(例如uint32_t)来加快它,尽管我怀疑这是必要的。

【讨论】:

    猜你喜欢
    • 2019-08-03
    • 2020-03-11
    • 2016-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-06
    • 1970-01-01
    相关资源
    最近更新 更多