【问题标题】:How to convert a string containing bytes to a byte array in C++? [duplicate]如何在 C++ 中将包含字节的字符串转换为字节数组? [复制]
【发布时间】:2014-06-14 08:33:21
【问题描述】:

示例代码:

#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”。我想将字符串 as hex 的内容复制到字符缓冲区中,这样当我通过套接字发送 544849... 时,它会在另一侧接收到该内容,而不是“35343438 ...”。

我已尝试使用其他帖子中建议的 stringstreamstd::hex,但这不起作用。

编辑

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

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

【问题讨论】:

  • 我建议不要使用裸数组,而是使用std::vectorstd::array
  • 答案是正确的,因为 printf 不正确,但这让我想知道为什么您认为通过套接字发送数据存在问题。我不希望通过套接字发送数据时会发生相同类型的错误,所以我很困惑。

标签: c++ c hex byte


【解决方案1】:

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

使用%c 将每个字符打印为一个字符。或者,使用更安全的std::cout 自动对字符执行“正确”操作。

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

【讨论】:

    【解决方案2】:

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

    #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");
    }
    

    【讨论】:

      【解决方案3】:

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

      #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;
      }
      

      【讨论】:

        猜你喜欢
        • 2012-04-07
        • 1970-01-01
        • 1970-01-01
        • 2022-01-23
        • 2013-07-08
        • 2021-11-11
        • 1970-01-01
        • 2013-07-24
        • 1970-01-01
        相关资源
        最近更新 更多