将字符串转换为十六进制到十六进制
问题描述:
我有一个函数,它需要一个uint64_t
变量。通常我会做到这一点:将字符串转换为十六进制到十六进制
irsend.sendNEC(result.value);
result.value
是uint64_t中为十六进制(我认为)。如果我这样做:
String((uint32_t) results.value, HEX)
我得到这个:
FF02FD
如果我做的:
irsend.sendNEC(0x00FF02FD)
它完美的作品,是我想要的。
而不是抓住result.value
,我想写它作为一个字符串(因为这是我从GET请求获得)。如何将"FF02FD"
分成0x00FF02FD
?
编辑:
也许这使得它更易于理解:
GET: http://192.168.1.125/code=FF02FD
//Arduino grabs the FF02FD by doing:
for (int i = 0; i < server.args(); i++) {
if (server.argName(i) == "code") {
String code = server.arg(i);
irsend.sendNEC(code);
}
}
这是我得到的错误:
no matching function for call to 'IRsend::sendNEC(String&)'
因为:
void sendNEC(uint64_t data, uint16_t nbits = NEC_BITS, uint16_t repeat = 0);
答
评论写作:
如前所述,使用C标准库函数(例如“string to unsigned long”(strtoul
)或“string to unsigned long long”(strtoull
))可以将包含十六进制值的字符串转换为实际整数值。 。从Arduino类型String
可以使用c_str()
成员函数获得实际的const char*
数据。总而言之,一个做了十六进制字符串整数转换为
uint64_t StrToHex(const char* str)
{
return (uint64_t) strtoull(str, 0, 16);
}
然后可以在代码中被称为
for (int i = 0; i < server.args(); i++) {
if (server.argName(i) == "code") {
String code = server.arg(i);
irsend.sendNEC(StrToHex(code.c_str()));
}
}
Appendum:要当心约在不同的平台上使用int
或long
。在带有8位微控制器(例如ATMega328P)的Arduino Uno/Nano上,int
是int16_t
。在32位ESP8266 CPU上,int
为int32_t
。
你想C回答或Arduino答案? –
@EugeneSh。呃,Arduino。他们会不一样吗? – MortenMoulder
Arduino不是C.它是C和C++的疯狂组合,以及一些愚蠢的编译规则。在C使用'strtoll'。 –