【问题标题】:why Hex data output differently?为什么十六进制数据输出不同?
【发布时间】:2013-05-27 13:47:59
【问题描述】:

我正在编写一个非常简单的代码来测试 c++ 上的 Hex 数据

int main()
{
    unsigned char bytestosend[4] = {0xB5, 0x62, 0x06, 0x08};

    cout << &bytestosend << endl;
}

终端上来的数据是:0xbfa1ef58

这怎么可能发生? 当我删除“&”时,它给了我奇怪的符号

【问题讨论】:

  • 使用 & 符号是给你数组的内存位置,而不是它的内容。如果删除 & 符号,您将打印一个非空终止字符串

标签: c++ hex


【解决方案1】:

当您使用 &amp; 时,它会输出数组的地址,而当您不使用时,它会将其打印为 ASCII 数据。

【讨论】:

  • 不是也需要空字节0x0吗?
  • 是的,它很可能会在数组末尾打印出一堆乱码。
  • @0x499602D2 只有用"..." 初始化的字符串文字才会为您输入一个终止空字符。
  • @GuyGreer 是的,我知道,但是由于他使用的是 char 数组并且他没有使用字符串文字对其进行初始化,所以他不应该明确添加空字节吗?
  • @0x499602D2 如果他希望能够将其用作字符串,可以。
【解决方案2】:

在此上下文中,“&”表示“地址”。您正在打印内存中 bytestosend 的位置,而不是它的内容。

删除那个“&”,你也不会得到你想要的。现在,流插入运算符 (operator &gt;&gt;) 看到了一个 char 数组,因此它将尝试打印您的数组,就好像它是一个字符串一样。您的数组不是以 null 结尾的,因此输出可能会持续一段时间。

如果您想以十六进制打印bytestosend 的所有四个元素,请使用以下内容:

std::cout.flags (std::ios::hex | std::ios::showbase);
std::cout << int(bytestosend[0]) << ", "
          << int(bytestosend[1]) << ", "
          << int(bytestosend[2]) << ", "
          << int(bytestosend[3]) << std::endl;

【讨论】:

  • 糟糕。代码已修复。 std::ostream &amp; operator&lt;&lt;(char) 将输入解释为 char 而不是整数。您需要转换为非 char 整数类型才能将输入解释为数字而不是字符。
  • Zeyad Serag - int 周围不需要这些括号。我回滚了你的编辑。我不喜欢使用(TypeName) x 之类的东西。这是一个 C 风格的演员表。我总是在编译时警告使用 C 风格的强制转换。 TypeName(x) 是一种功能风格的演员表。这是 C 中的非法语法,但请记住 C++ 不是 C。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-13
  • 2016-06-09
  • 2010-09-19
  • 2019-12-01
相关资源
最近更新 更多