无法读取二进制编码的十六进制值

时间:2013-11-08 06:12:28

标签: c++ pointers binary hex type-conversion

我正在从指针* p读取二进制编码的十六进制值。

十六进制值为: 2001:0db8:3c4d:0015:0000:0000:abcd:ef12。

相应的二进制值为: 00100000000000010000110110111000001111000100110100000000000101010000000000000000000000000000000010101011110011011110111100010010

char *mMmapBase;   
mMmapBase = (char *) mmap( 0, mCollectionFileSize, PROT_READ | PROT_WRITE,
            MAP_SHARED, fileno( aFilePtr ), 0 );

char *p = &mMmapBase[107]; //read from the offset 107
int aTwoBytes;
memcpy(&aTwoBytes, p, 2); //copy first two bytes 

cout << "aTwoBytes : " << aTwoBytes << endl;

我应该以十六进制形式或二进制形式获得输出,但是,我得到以下输出 - aTwoBytes:539492652。谁能告诉我为什么?

另外,我想以十六进制形式输出如何实现呢?

2 个答案:

答案 0 :(得分:2)

因为您将其打印为十进制。您可能还会混合值的表示(如十进制,十六进制等)以及值如何存储在计算机中(始终为二进制)。

如果要打印十六进制数字,则必须使用std::hex iostream manipulator

std::cout << "aTwoBytes : " << std::hex << aTwoBytes << '\n';

您可能还会获得“奇怪”值,因为您正在将16位值复制到32位变量中。您可能希望使用int(在大多数平台上与uint16_t相同)而不是unsigned short。为此,您可能需要包含<cstdint>

std::uint16_t aTwoBytes;

答案 1 :(得分:0)

因为它是以十进制打印的。

需要了解数字和基础 - 请参阅http://en.wikipedia.org/wiki/Radix