2010-01-13 42 views
0

这里是一些关于我的长期问题的新测试代码。 我想,如果我长时间编码我的东西,那么这是移植的一半战斗。另一半是将其变成大端,这样它就可以在任何64位系统上工作。 ,所以我做了以下内容:为什么stroull()不适用于具有十六进制值的字节数组?

#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字节的数组。我也不知道我会如何使用指针来做到这一点。我想我需要一个长长的指针数组来存储所有这些东西,然后调用每个字节的交换来交换每个指针的值。我个人还没有通过sizeof(long)来增加指针的增量。

+0

我想我是试图采取的字节数组有十六进制值在32位ENV运行到64位环境。所以,这是探索这种情况的方法之一。 所以我在想如何做到这一点。这让我想起了。所以我正在测试它。 典型的字节输出看起来像这样 22f6554c4341ef55c223d3d237f10cd0ff4ba48f 将在大端形式,并且该转换成十进制,所以我可以从最终输出输出x小数是什么,我试图做的。 – djones2010 2010-01-13 18:05:50

+0

一个字节数组没有十六进制值。一个字节数组有字节(整数值)。你恰好在用十六进制整数文字初始化你的数组,但它与使用'{171,50,84,205,68}'初始化它没有什么不同。如果你试图将一个32位整数转换为64位整数,那么你可以投射(如果你不想签名扩展,可能会掩盖或使用无符号类型)。 – jamesdlin 2010-01-13 19:14:10

回答

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

5

因为字节0xab,0x32,0x54,0xcd,0x44不代表包含ASCII数字的空终止字符串,这是strtoll期望看到的。

你想达到什么目的?如果你想长长的重新诠释阵列作为,只是做

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

(除非你需要添加三个字节,也使整个阵列8字节对齐)。

+0

我想我试图采取一个字节数组,有十六进制值在32位env运行到64位env。所以,这是探索这种情况的方法之一。所以我在想如何做到这一点。这让我想起了。所以我正在测试它。一个典型的字节输出看起来像这样22f6554c4341ef55c223d3d237f10cd0ff4ba48f把它放在一个大端形式,并将其转换成十进制,所以我可以从最终输出中输出x小数是我正在尝试做的。 – djones2010 2010-01-13 18:50:28

0

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

2

它没有失败 - 它已经工作。它转换成不能转换的第一个数字,字符代码AB hex不是有效的十六进制数字。

0

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

编译器会将您给它的所有数字都视为相同,无论它们在哪个基础中给出,所以'字节'包含{171,50,84,205,68}。你不需要自己做转换。

相关问题