如何将长长的ASCII十六进制值转换为字符串?

时间:2011-11-16 05:34:31

标签: c++ c string hex

我有long long持有ASCII十六进制值,并希望将其转换为字符串。我有这段代码:

char myBuffer[8];
long long myLongLong = 0x7177657274797569;
sprintf(myBuffer,"%c%c%c%c%c%c%c%c",myLongLong);
int x;
cout << myBuffer;
cin >> x;
return 0;

十六进制代码应该是"qwertyui",但它总是给出其他值。

我尝试使用%c%s%X,但它没有提供我需要的输出,最接近的是%c,但它只打印出一个字符

5 个答案:

答案 0 :(得分:3)

这个代码在很多方面都是错误的,我不知道从哪里开始......

  • myBuffer太小,无法容纳8 chars + NUL终止符,即。应为myBuffer[9]
  • sprintf期待8个参数,你只传递1.其他必需参数将是堆栈中的任何参数。
  • myLongLong不是char
  • 您没有考虑字节顺序。
  • 您正在使用C函数并在C ++中以C方式执行操作。为什么不使用std::string而不是C风格的字符串,stringstream作为sprintf的替代?

最接近几乎的工作示例,与您的示例类似,如下所示:

#include <cstdio>
#include <iostream>

using namespace std;

int main(void)
{
   char myBuffer[9];
   long long myLongLong = 0x7177657274797569;
   char *c_ptr = (char*)&myLongLong;
   sprintf(myBuffer,"%c%c%c%c%c%c%c%c", c_ptr[0], c_ptr[1], c_ptr[2], c_ptr[3], c_ptr[4], c_ptr[5], c_ptr[6], c_ptr[7]);
   int x;
   cout<<myBuffer;
   cin>>x;
   return 0;
}

将在我的小端机器上输出"iuytrewq"。正如我所提到的,这并没有考虑到字节序。如果机器是little-endian,那么你可以反向读取/打印字节。

我真的不明白你为什么试图这样做......

答案 1 :(得分:1)

使用字符串流

long long myLongLong = 0x7177657274797569;
std::stringstream ss;
ss << std::hex << myLongLong;
std::cout << ss << std::endl

答案 2 :(得分:0)

你想打印长长的每个字节作为ascii char?

然后你需要循环遍历长一次提取一个字节,查看位移和屏蔽。

提示通常更容易(如果你知道长度)从最后一个字节工作并向右移动

或 - 你可以将long-long记忆到char数组中 - 除了任何字节排序问题

答案 3 :(得分:0)

你可以尝试

union { char buf[8]; long long num; } u;
u.num =  0x7177657274797569LL;
cout << u.str << endl;

但我不明白你想要做什么。那么字节序呢?

答案 4 :(得分:0)

请尝试以下代码。

#include <iostream>

using namespace std;

int main(void)
{

char myBuffer[8];
long long myLongLong = 0x7177657274797569;

for(int i = 0; i<8;i++)
{
    myBuffer[i] = myLongLong>>(64-(i+1)*8);
}

cout<<myBuffer<<endl;

return 0;

}