我有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
,但它只打印出一个字符
答案 0 :(得分:3)
这个代码在很多方面都是错误的,我不知道从哪里开始......
myBuffer
太小,无法容纳8 chars
+ NUL终止符,即。应为myBuffer[9]
。sprintf
期待8个参数,你只传递1.其他必需参数将是堆栈中的任何参数。myLongLong
不是char
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;
}