【问题标题】:casting elements of uint8 vector to stringstream将 uint8 向量的元素转换为字符串流
【发布时间】:2015-08-28 07:53:01
【问题描述】:

我在弄清楚如何将我的 uint8 向量转换为字符串流时遇到了一些麻烦。

在输入我得到 uint8 的向量时,前 9 个字节是我的字符串流中不需要的标志,接下来的 2 个字节是我需要作为字符串的一些数据,我们称它们为“name1”,接下来的 2 个字节是另一个名称,以免称它为“name2”,然后是 4 个字节,它们是一些 uint32 数字(但写为 4 个 uint8 字节),我们只称它为“数字”。现在我需要将这些数据传递给 stringstream 但是:

  • name1 和 number2 需要写成字节(byte 0x52 -> char[2]={"5","2"})
  • 数字需要转换为 uint32
  • 在最终的字符串流中所有变量都需要用分号隔开

所以如果我得到一个像这样的向量:

---一些 9 个字节---, 0x05, 0x00, 0x01,0x00,0x00,0x00,0x08,0x0E, ---一些其他数据---

我需要 stringstream 是这样的:

“0500;0100;2062;”

我已经设法弄清楚如何将数字转换为 uint32:

uint8_t tab[4];
for(int i=4; i!=0; --i)
{
    tab[4-i]=data[i+14];
}
uint32_t* var = (uint32_t*)tab;

有更好的方法吗?

编辑:

如何将 uint8 值作为字符传递给字符串?

示例:

字节输出:0x05

字符串输出:05

我可以使用“

【问题讨论】:

    标签: c++ vector stringstream uint8t


    【解决方案1】:

    如果你有一个字符串,只需循环字符串并将字符输出到你的字符串流

    std::string name = "name1";
    std::stringstream ss;
    for(auto c : name)
      ss << std::static_cast<int>(c);
    ss << ";";
    

    附注:

    uint32_t* var = (uint32_t*)tab;
    

    完全没用,你不需要指针。

    【讨论】:

    • 好的,我明白你的意思,但我需要用数据向量中的 uint8 个字符填充字符串,我如何用这些字符填充字符串,以便数据向量中的 0x05 和 0x00 将在字符串中查找像这样:“0500”我只需要这两个字节。那么我需要投射它
    • 你的问题不是很清楚。请澄清,不要用类似短信的英文写。如果你需要填充一个字符串,你可以随时append你的字符到你需要的字符串。
    • 添加了一个澄清的编辑,希望它能让我的问题清楚。
    【解决方案2】:

    我不确定这是否能解决您的问题,但我会采取不同的方法。

    我会使用一个结构来描述底层协议,然后继续。示例:

    struct dx{
      uint8 _junk0[9];
      char  name1[2];
      char  name2[2];
      uint32 num;
    } __attribute__((packed));
    
    uint8 *input;
    dx* struct=(dx*)input;
    printf("%d",dx->num);
    

    【讨论】:

    • 这就是CC++ 的方式是覆盖运算符&lt;&lt; 也不使用printf,而是使用cout
    • 更大的问题是这违反了严格的别名。
    • @Voo:感谢您注意到这一点,我已经阅读过它 - 是的,它就是这样做的 ;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-08
    相关资源
    最近更新 更多