Как преобразовать длинные длинные шестнадцатеричные значения ASCII в строку? - PullRequest
0 голосов
/ 16 ноября 2011

У меня есть 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 ]

3 голосов
/ 16 ноября 2011

Этот код неверен во многих отношениях, я не знаю, с чего начать ...

  • 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" на моей машине с прямым порядком байтов. Как я уже говорил, это не учитывает порядок байтов. Если машина работает с прямым порядком байтов, вы можете читать / распечатывать байты в обратном порядке.

Я действительно не понимаю, почему вы пытаетесь это сделать, хотя ...

1 голос
/ 16 ноября 2011

Использовать поток строк

long long myLongLong = 0x7177657274797569;
std::stringstream ss;
ss << std::hex << myLongLong;
std::cout << ss << std::endl
0 голосов
/ 16 ноября 2011

Попробуйте следующий код.

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

}
0 голосов
/ 16 ноября 2011

Вы можете попробовать

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

Но я не понимаю, что вы действительно хотите сделать.А как насчет порядка байтов?

0 голосов
/ 16 ноября 2011

Вы хотите напечатать каждый байт long-long как символ ascii?

Затем вам нужно перебрать длинный байт, извлекая по одному байту за раз, посмотреть на сдвиги битов и маскировку.

Подсказка: как правило, проще (если вы знаете длину) работать с последним байтом и сдвигать вправо

или - вы можете просто memcpy long-long в массив char - за исключением любого порядка байтоввопросы

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...