首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C-如何为strtol设定限制

C-如何为strtol设定限制
EN

Stack Overflow用户
提问于 2017-03-02 09:41:51
回答 1查看 825关注 0票数 0

我正在尝试strtol将包含ASCII值的uint8_t数组的部分转换为整数值。这意味着在串行端口上接收的字节在ASCII值中格式化为"89ABC“等。

但是strtol从起始位置转换了接收到的uint8_t数组的其余部分,给出了一个完全错误的值。所以我必须这样做:

代码语言:javascript
运行
复制
tempvalue = MerdPC.buf[15]; MerdPC.tiltcmd=(uint8_t)strtol(&tempvalue, NULL, 16);
tempvalue = MerdPC.buf[16]; MerdPC.tiltparam=((uint16_t)strtol(&tempvalue, NULL, 16))<<8;
tempvalue = MerdPC.buf[17]; MerdPC.tiltparam|=((uint16_t)strtol(&tempvalue, NULL, 16))<<4;
tempvalue = MerdPC.buf[18]; MerdPC.tiltparam|=(uint16_t)strtol(&tempvalue, NULL, 16);

而且这个很管用。但是,是否有更好的方法来解决这个问题,而不是涉及一个临时变量?

编辑:

输入字符串示例是:

十六进制值: 23 31 43 30 30 30 31 37 38 39 0D 0A

ASCII:#1C0000000000001789..

这四个粗体字符分别是tiltcmd字节和tiltparam字节。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-03-02 10:05:20

这个有用吗?

代码语言:javascript
运行
复制
char tiltparam[] = "#1C0000000000001789..";

char temp[5] = { 0 };
strncpy(temp, &tiltparam[15], 4);
int tempvalue = strtol(temp, NULL, 10);
...

我们仍然需要temp缓冲区,但它比您的解决方案更短、更易读。

或者,如果您在其他地方有更多的转换,您可以创建一个函数:

代码语言:javascript
运行
复制
int ExtractHex(const char *hexstr, int offset)
{
    char temp[5] = { 0 };
    strncpy(temp, &hexstr[offset], 4);
    return strtol(temp, NULL, 10);
}
...
int somevalue = ExtractHex(tiltparam, 15);
...
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42551781

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档