【发布时间】:2018-10-17 15:09:52
【问题描述】:
我需要 sscanf 一个 20 位数的号码,它刚好超出了 uint64_t 的范围。如果我不能在 uint64_t 中包含完整的数字,我希望将其设为 uint8_t[10](表示每个字节 2 位数字),我可以这样做:
const char *resp = "+QCCID: 89445003071864431280";
void parse_bytes() {
uint8_t bytes[10] = {0};
sscanf(resp, "+QCCID: %2hhu%2hhu%2hhu%2hhu%2hhu%2hhu%2hhu%2hhu%2hhu%2hhu",
&bytes[9], &bytes[8], &bytes[7], &bytes[6], &bytes[5],
&bytes[4], &bytes[3], &bytes[2], &bytes[1], &bytes[0]);
// print just for testing, not the end result
for(int i=9; i>=0; i--) {
printf("%02d", bytes[i]);
}
}
这工作得很好,但不是特别漂亮的代码。有没有更简洁的方法将这样的东西扫描到数组中?
为了澄清结果的意图:结果不会用于计算,它将通过蓝牙低功耗发送到另一台设备。
更新:我最终选择了@PetarVelev 建议的修改版本。由于此问题范围之外的原因,我使用了位字段结构。如果有人感兴趣,我将我的解决方案作为下面的答案之一发布。
【问题讨论】:
-
你打算用这个号码做什么?你在做一些计算吗?如果有,具体是什么?
-
它的目的是通过 BLE 到不同的设备,因此需要保持内存占用尽可能小。
-
另一端在用它做什么?如果它只是作为 ID 打印,则将其作为文本发送更有意义。当然,它会占用 20 个字节,但使用更接近格式,因为它不那么麻烦和混乱。
-
一旦到达另一端,它就会被保存在数据库中。我同意将其视为字符串会不那么麻烦。涉及到用户交互,所以我需要看看在 BLE 上多 10 个字节会导致多少额外延迟。