将人类可读的大小(k,M,G,T)解析为C中的字节

时间:2013-04-19 15:00:57

标签: c parsing scanf atoi

我正在寻找一种快速的方法来将人类可读的字节大小(例如:100,1k,2M,4G)解析为字节值。输入为char *,输出必须为size_t(例如,无符号,可能为64位或32位整数,具体取决于体系结构)。代码应检测无效输入并返回一个值,表明它是无效输入。

示例:

Input  => size_t result
-----------------------
"100"  => 100
"10k"  => 10240
"2M"   => 2097152
"4G"   => 4294967296 on 64-bit machine, error (overflow) on 32-bit machine
"ten"  => error

以下是要扩展以处理单位前缀的代码示例片段:

int parse_human_readable_byte_size(char *input, size_t *result) {
    /* TODO: needs to support k, M, G, etc... */
    return sscanf("%zu", result) == 1;
}

以下是一些额外要求:

  • 必须以C(无C ++)
  • 完成
  • 仅使用标准库(或至少是常用的)库(例如sscanfatoi

每个程序执行代码预计只运行几次,因此较长的高性能代码比较小的可读代码更受青睐。

2 个答案:

答案 0 :(得分:4)

这是一个潜在的实施方案。包括检测所有错误的代码;如果您愿意,请填写您自己的处理代替goto

char *endp = s;
int sh;
errno = 0;
uintmax_t x = strtoumax(s, &endp, 10);
if (errno || endp == s) goto error;
switch(*endp) {
case 'k': sh=10; break;
case 'M': sh=20; break;
case 'G': sh=30; break;
case 0: sh=0; break;
default: goto error;
}
if (x > SIZE_MAX>>sh) goto error;
x <<= sh;

答案 1 :(得分:0)

我将尝试使用char来分析输入char的子函数。

进一步明显的错误检查,我会使它在数字常量中翻译符号,乘以对应于常数的基数。

相关问题