为什么stroull()不能处理具有十六进制值的字节数组?

时间:2010-01-13 17:03:51

标签: c++

这里有一些关于我的长期问题的新测试代码。 我认为如果我长时间编码我的东西那么这就是移植的一半。 另一半是将它变成大端,因此它可以在任何64位系统上工作。 所以我做了以下事情:

#include <iostream>  
#include "byteswap.h"
#include "stdlib.h"

using namespace std;

int main()

{

char bytes[6] = {0x12,0x23,0xff,0xed,0x22,0x34};


//long *p_long = reinterpret_cast<long*> (bytes);


long long *p_long = reinterpret_cast<long long*> (bytes);


std::cout<<"hex="<<std::hex<<*p_long<<"LE"<<std::endl;


*p_long = bswap_64(*p_long);


std::cout<<"hex="<<std::hex<<*p_long<<"BE"<<std::endl;




return 0;

} 

在我看来,这是最简单的方法。现在的问题是使用bswap ...我得到以下输出

十六进制= 34563422edff2312LE 十六进制= 0BE

我把第一个字节作为LE。但现在似乎64位交换功能无效。我认为这可以解决我遇到的问题。

考虑到我将在一个20字节的数组上运行。我也不确定如何使用指针来做到这一点。我想我需要一个长长指针数组来存储所有这些东西,然后在每个指针上调用byteswap来交换每个指针中的值。我个人还没有通过sizeof(long)进行指针递增,以便在之前递增。

5 个答案:

答案 0 :(得分:5)

因为字节0xab,0x32,0x54,0xcd,0x44不表示包含ASCII数字的以空字符结尾的字符串,这正是strtoll期望看到的。

你想要达到什么目的?如果要将数组重新解释为long long,只需执行

signed long long test = *((signed long long *)bytes);

(除了你需要再添加三个字节,并使整个数组8字节对齐)。

答案 1 :(得分:2)

它没有失败 - 它已经奏效了。它转换为无法转换的第一个数字,字符代码AB hex不是有效的十六进制数字。

答案 2 :(得分:0)

0xab不是有效的十六进制ASCII字符。

答案 3 :(得分:0)

strtoll将cstring转换为整数。 bytes不是cstring,它是一个5字节的数组。 它返回0,因为第一个字节不是十六进制字符('1'到'0'或'a'到'f')。

编译器会将您给出的所有数字都视为相同,无论它们被赋予哪个基数,因此“bytes”包含{171,50,84,205,68}。您不需要自己进行转换。

答案 4 :(得分:0)

如果您希望此程序输出“ab3254cd44”,那么您使用了错误的功能。 bytes不是字符串。它只是一个包含5个值的数组。

试试这个:

int bytes[5] = {0xab,0x32,0x54,0xcd,0x44};
cout << hex;
copy(&bytes[0], &bytes[sizeof(bytes)/sizeof(bytes[0])], ostream_iterator<int>(cout));

节目输出:

  

ab3254cd44