我正在寻找一种快速的方法来将人类可读的字节大小(例如: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;
}
以下是一些额外要求:
sscanf
,atoi
)每个程序执行代码预计只运行几次,因此较长的高性能代码比较小的可读代码更受青睐。
答案 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的子函数。
进一步明显的错误检查,我会使它在数字常量中翻译符号,乘以对应于常数的基数。