如何在C ++中将包含字节的字符串转换为字节数组?

时间:2014-04-28 17:11:17

标签: c++ c hex byte

示例代码:

#include <iostream>
#include <string>
#include <string.h>
#include <cstdio>

int main(int argc, char ** argv)
{
    std::string mystring = "5448495320574f4e5420574f524b";
    std::cout << mystring << std::endl;
    char buffer[mystring.size()];

    memset(buffer, '\0', mystring.size());
    mystring.copy(buffer, mystring.size(), 0);

for (int i = 0; i < mystring.size(); i++)
{
    printf("%X", buffer[i]);
}
printf("\n");
}

输出:

5448495320574f4e5420574f524b
35343438343935333230353734663465353432303537346635323462

问题:

我的字符串包含“THIS WONT WORK”,表示为十六进制。我想将字符串的内容作为十六进制复制到一个字符缓冲区中,这样当我通过套接字发送544849...时,它会在另一端收到完全相同的内容,而不是“35343438 ......”。

我尝试过使用stringstream&amp;其他帖子中提到std::hex,但这不起作用。

修改

对不起,这里有更多信息。如果它仍然是重复的,我会关闭它。 mystring中的数据就是一个例子。我实际得到的数据是在“内容”中通过AMQP发送的数据结构。 getContent()返回一个std :: string,就像getContentBytes()。

字符串的前两个字节是54.但是,当我将其写入套接字时,另一个服务器将第一个字节读取为35,并使消息无效。

3 个答案:

答案 0 :(得分:2)

问题是您使用printf("%X")进行打印。这会将每个字符的数值转换为十六进制,以便初始5变为35,依此类推。

使用%c将每个字符打印为字符。或者,使用更安全的std::cout来自动执行&#34;右键&#34;有角色的东西。

请注意,无需将字符串复制到新缓冲区中。只需调用mystring.data()mystring.c_str()即可获得指向字符串自己的字符数组的指针。

答案 1 :(得分:0)

您以两种不同的方式打印两个字符串。第一个打印为字符,第二个打印为十六进制。尝试以相同的方式打印第一个,我打赌你会得到相同的输出:

#include <iostream>
#include <string>
#include <string.h>
#include <cstdio>

int main(int argc, char ** argv)
{
    std::string mystring = "5448495320574f4e5420574f524b";
    for (int i = 0; i < mystring.size(); i++)
    {
        printf("%X", mystring[i]);
    }
    printf("\n");
    char buffer[mystring.size()];

    memset(buffer, '\0', mystring.size());
    mystring.copy(buffer, mystring.size(), 0);

    for (int i = 0; i < mystring.size(); i++)
    {
        printf("%X", buffer[i]);
    }
    printf("\n");
}

答案 2 :(得分:0)

如果我理解正确,那么你需要的是以下

#include <iostream>
#include <string>
#include <cctype>

int main()
{
    std::string s( "5448495320574f4e5420574f524b" );
    std::string::size_type n = s.size() & ( ~static_cast<std::string::size_type>( 1 ) );
    char *p = new char[n / 2];

    for ( std::string::size_type i = 0; i < n; i++ )
    {
        char c = std::isdigit( s[i] ) ? s[i] - '0' : std::toupper( s[i] ) - 'A' + 10;
        if ( i % 2 == 0 )
        {
            p[i / 2] = c;
        }
        else
        {
            p[i / 2] = ( ( unsigned char ) p[i / 2] << 4 ) | c;
        }
    }

    std::cout.write( p, n / 2 );
    std::cout << std::endl;

    delete []p;
}