2017-06-21 672 views
0

我有一个函数,它需要一个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); 
+0

你想C回答或Arduino答案? –

+0

@EugeneSh。呃,Arduino。他们会不一样吗? – MortenMoulder

+0

Arduino不是C.它是C和C++的疯狂组合,以及一些愚蠢的编译规则。在C使用'strtoll'。 –

回答

2

评论写作:

如前所述,使用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:要当心约在不同的平台上使用intlong。在带有8位微控制器(例如ATMega328P)的Arduino Uno/Nano上,intint16_t。在32位ESP8266 CPU上,intint32_t