Как преобразовать массив беззнаковых символов в шестнадцатеричную строку в C - PullRequest
7 голосов
/ 14 апреля 2011

Можно ли представить массив символов без знака в виде строки?

Когда я искал его, я обнаружил, что только memset () мог сделать это (но символ за символом). Предполагая, что это не правильный путь, есть ли способ сделать преобразование?

Контекст: я пытаюсь сохранить выходные данные криптографической хеш-функции, которая оказывается массивом беззнаковых символов.
например:

unsigned char data[N]; ...
for(i=0;i<N;i++) printf("%x",data[i]);

Моя цель - представить данные в виде строки (% s), а не обращаться к ним по каждому элементу. Так как мне нужен вывод хеша в виде строки для дальнейшей обработки.

Спасибо!

Ответы [ 5 ]

19 голосов
/ 14 апреля 2011

Итак, основываясь на вашем обновлении, вы говорите о попытке преобразовать буфер без знака в шестнадцатеричную интерпретацию, что-то вроде этого:

#define bufferSize 10
int main() {
  unsigned char buffer[bufferSize]={1,2,3,4,5,6,7,8,9,10};
  char converted[bufferSize*2 + 1];
  int i;

  for(i=0;i<bufferSize;i++) {
    sprintf(&converted[i*2], "%02X", buffer[i]);

    /* equivalent using snprintf, notice len field keeps reducing
       with each pass, to prevent overruns

    snprintf(&converted[i*2], sizeof(converted)-(i*2),"%02X", buffer[i]);
    */

  }
  printf("%s\n", converted);

  return 0;
}

Какие выходы:

0102030405060708090A
2 голосов
/ 14 апреля 2011

Ну, строка в C - это не что иное, как несколько символов один за другим.Если они не подписаны или подписаны, это не большая проблема, вы можете легко разыграть их.

Таким образом, чтобы получить строку из массива без знака, все, что вам нужно сделать, это убедиться, что последний байт является завершающим байтом '\ 0', а затем преобразовать этот массив в char * (или скопировать его).в массив char)

2 голосов
/ 14 апреля 2011

В C строка - это массив char, оканчивающийся символом со значением 0.

Независимо от того, является ли char типом со знаком или без знака, язык не определяется,Вы должны быть явными и использовать unsigned char или signed char, если вам действительно важно.

Непонятно, что вы подразумеваете под "представлением" массива без знака в виде строки.Достаточно просто отбросить знак, если вы хотите сделать что-то вроде:

const unsigned char abc[] = { 65, 66,67, 0 }; // ASCII values for 'A', 'B', 'C'.

printf("The English alphabet starts out with '%s'\n", (const char *) abc);

Это сработает, к printf() разницы нет, она увидит указатель на массивсимволы и интерпретировать их как строку.

Конечно, если вы работаете в системе, которая не использует ASCII, может произойти сбой в тех случаях, когда это не сработает.Опять же, ваш вопрос не очень ясен.

1 голос
/ 14 января 2015

Я успешно использую это для преобразования массива без знака в std: string

unsigned char array[128];
std::stringstream buffer;
for (int i = 0; i < 128; i++)
    {
        buffer << std::hex << std::setfill('0');
        buffer << std::setw(2)  << static_cast<unsigned>(array[i]);
    }
std::string hexString = buffer.str();
0 голосов
/ 14 апреля 2011

Пример, как вы просили:

без знака char arr [РАЗМЕР];

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