将二进制十六进制数据转换为ASCII等效值并存储在String中

时间:2016-01-14 06:06:06

标签: c++ string arduino ascii binary-data

我在Arduino上使用C ++。

假设我有一个二进制数据流;

二进制数据:0xFF, 0x00, 0x01, 0xCC

我想将其转换为ASCII等价物并将其存储在String对象类型中。

转换后的字符串应如下所示“FF0001CC”。

以下是一些草案代码。

char buffer[100];
String myString;

for (int i=0; i < numBytes; i++)
{
    //assume buffer contains some binary data at this point 
    myString += String(buffer[i], HEX);
}

此代码存在的问题是myString包含FF01CC,而不是FF0001CC

3 个答案:

答案 0 :(得分:2)

我的猜测是每次附加文本时String类都会调整大小,这可以改进。 假设你知道输入大小并且它是常数,你可以试试这个:

char outbuffer[numBytes*2+1];   
const char* pHexTable="0123456789ABCDEF";
int iPos=0;

for(int i=0; i<numBytes; i++){
    //assume buffer contains some binary data at this point
    const char cHex=buffer[i];
    outbuffer[iPos++]=pHexTable[(cHex>>4)&0x0f];
    outbuffer[iPos++]=pHexTable[cHex&0x0f];
}
outbuffer[iPos]='\0';

答案 1 :(得分:1)

C ++中有stringstream类,在这种情况下可以使用它。使用C时,将使用一个sprintf语句sprintf(buffer, "%02x%02x%02x", bytes[0], bytes[1], bytes[2])(最好是snprintf)将三个字节打印到缓冲区。

#include <sstream>
#include <iostream>
#include <iomanip>

int main(void)
{
    std::stringstream ss;
    unsigned char bytes[] = {0xff, 0x00, 0xcc};

    ss << std::hex;

    // This did not work, 00 was printed as 0
    // ss << std::setfill('0') << std::setw(2)
    // ...
    // ss << (unsigned int)bytes[i]

    for (int i=0; i<3; i++) {
       unsigned int tmp = bytes[i];
       ss << (tmp >> 4) << (tmp & 0xf);
    }
    std::cout << ss.str();

    return 0;
}

答案 2 :(得分:1)

理解numBytes可以大于3或4(否则为什么缓冲区大小为100?) 在使用string时,我更喜欢使用C ++类(您需要string,而不是char[]?)。

请考虑使用stringstream类的以下示例(仅包含sstreamiomanip标准标题):

    string myString;
    stringstream myStringStream;
    myStringStream << setbase(16);
    myStringStream << uppercase;
    for (int i = 0; i < numBytes; i++)
    {
        myStringStream << (0xFF & (unsigned int) buffer[i]);
    }
    myString = myStringStream.str();

我无法将我的示例的速度与其他答案进行比较,但此解决方案实际上是任何大小的buffer的C ++方法。