【发布时间】:2019-03-12 20:54:55
【问题描述】:
当我这样做时:
cout << std::hex << (short)('\x3A') << std::endl;
cout << std::hex << (short)('\x8C') << std::endl;
我希望得到以下输出:
3a
8c
但是,我有:
3a
ff8c
我想这是由于char——更准确地说是一个签名char——存储在内存中的方式:0x80 以下的所有内容都不会加上前缀;另一方面,0x80 及以上的值将以 0xFF 为前缀。
当给定signed char 时,如何获得其中实际字符的十六进制表示?换句话说,我如何获得\x3A 的0x3A 和\x8C 的0x8C?
我认为条件逻辑在这里不太适合。虽然我可以在需要时从生成的 short 中减去 0xFF00,但这似乎不是很清楚。
【问题讨论】:
-
你为什么首先使用 char ?为什么不是 0x3a 等? ff 来自符号扩展,因为您的编译器碰巧考虑了 char 签名。结果是(有符号)短,但十六进制输出模式将所有整数视为无符号,因此您看到 ff 但没有负号。
-
@CruzJean:上下文是
char来自包含二进制数据的char *。前两个字节对应一个标识符。为了重构标识符,我使用了unsigned short id = (unsigned short)d[0] * 256 + d[1],在某些情况下,这并没有给出我最初期望的结果。 -
数据写成短裤了吗?
-
@CruzJean:因为 ID 是两个字节长,我会说是的,
unsigned short。 -
如果它被写成短片,你应该把它读成短片。手动组合两个字节假定具有特定的字节顺序,并且比直接读取为短字节要慢。