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

How to convert long long ASCII hex values into a string?

本文关键字:转换 字符串 ASCII 十六进制      更新时间:2023-10-16

我有一个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,但它只打印出一个字符。

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

  • myBuffer太小,不能容纳8个chars + NUL终止符,即。应该是myBuffer[9] .
  • sprintf期待8个参数,你只传递了1个。其他必需的参数将是堆栈上的任何参数。
  • myLongLong不是char
  • 你没有考虑端序。
  • 你在c++中使用C函数并以C的方式做事。为什么不使用std::string s来代替c风格的字符串,而使用stringstream s来代替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,那么你可以反向读取/打印字节。

我真的不明白你为什么要这么做…

你可以试试

union { char buf[8]; long long num; } u;
u.num =  0x7177657274797569LL;
cout << u.str << endl;
但是我不明白你真正想做的是什么。

使用字符串流

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

要将long-long的每个字节打印为ascii字符吗?

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

提示从最后一个字节开始右移通常更容易(如果你知道长度)

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

试试下面的代码。

#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;
}