2014-10-30 67 views
-1

我有一个char阵列中存储的十六进制C++六角阵列附加字符

char peer0_0[] = {0xc1, 0x02, 0x06, 0x08, 0x00, 0x5e, 0x84}; 

我尝试和在日志中读取的值

std::stringstream ss2; 
ss2 << std::hex; 
for (int i(0) ; i<8 ; ++i) 
    ss2 << (int)peer0_0[i] << ' '; 
m_manager->log(ss2.str(),HIGH_IMPORTANCE); 

结果是

ffffffc1 2 6 8 0 5e ffffff84 0 

我不不明白为什么只在两种价值之前追加'ffffff'而不是其他价值?另外为什么最后会出现零点?这是阅读的问题吗?请帮忙。

+1

''char'在您的平台上签名,您需要在'int'之前将其转换为'unsigned char'。 – user657267 2014-10-30 11:59:11

+0

最后的零(或其他垃圾)是因为你循环'i <8',但只有七个元素。将'8'改为'7'或'sizeof peer0_0'。或者使用基于范围的循环。 – 2014-10-30 12:27:49

+0

我会说,使用printf,std :: stuf很烂。 – 2014-10-30 12:34:56

回答

3

f是因为你投到了int而这两个数字的最高位已设置,即它们是负数和“符号扩展”以产生32位整数。

0最后实际上是未定义的行为:您在循环中打印8个数字,但数组中只有7个。

+0

如何将unsigned char数组转换为char数组?我需要将此数组传递给套接字send() – user2837961 2014-10-30 12:12:42

+0

当我这样做时出现错误 unsigned char * arr = {0xc1,0x02,0x06,0x08,0x00,0x5e,0x84}; – user2837961 2014-10-30 12:20:40

+1

@ user2837961:你为什么从一个数组改变为一个指针? – 2014-10-30 12:24:30

1

问题是,您的编译器默认认为类型charsigned char。在这种情况下,例如值

0xc1 

被认为是负数,因为符号位被设置。

你可以定义数组作为

unsigned char peer0_0[] = {0xc1, 0x02, 0x06, 0x08, 0x00, 0x5e, 0x84}; 

或者你可以明确地投的阵列中的每个元素键入unsigned char

for (size_t i = 0 ; i < sizeof(peer0_0) ; ++i) 
    ss2 << (int)static_cast<unsigned char>(peer0_0[i]) << ' '; 

考虑到,你的数组只有7个元素的帐户。

+1

'char'和'signed char'是不同的类型,无论是否OP的编译器将'char'视为签名类型。 – 2014-10-30 12:25:00

+0

现在的问题是将无符号字符转换为常量字符* – user2837961 2014-10-30 12:32:45

+0

@ user2837961您并未初始化数组,而是单个对象。写入而不是无符号字符arr [] = {0xc1,0x02,0x06,0x08,0x00,0x5e,0x84}; – 2014-10-30 12:34:49

0

您可以使用std :: setw函数来限制打印数字的大小。

std::stringstream ss2; 
ss2 << std::hex << std::setfill('0'); 
for (int i = 0; i < 8; ++i) 
{ 
    ss2 << std::setw(2) << static_cast<int>(peer0_0[i]) << ' '; 
} 
std::cout << ss2.str() << std::endl;