Я знаю, что прошло 4 года после того, как был задан вопрос, но я много раз получал эту страницу, когда искал решение этой проблемы - так что, возможно, я не единственный человек, и мой ответ кому-нибудь поможет;)
Я нашел информацию, что серийный номер переставлен в struct _CERT_INFO
, поэтому байты из certInfo.SerialNumber.pbData
должны быть обращены.Кроме того, вы должны взять только certInfo.SerialNumber.cbData
байт (cbData
- длина серийного номера).Это важно, потому что, когда я пытался использовать целые pbData
, я получал много мусорных байт.
Когда я перевернул байты, я конвертировал их в шестнадцатеричные.И это все;)
Мой код:
unsigned char* pbData = pCertContext->pCertInfo->SerialNumber.pbData;
int cbData = pCertContext->pCertInfo->SerialNumber.cbData;
std::string serial((char*)pbData);
std::string serialSubstring = serial.substr(0,cbData);
std::reverse(serialSubstring.begin(), serialSubstring.end());
String snInHex(string_to_hex(serialSubstring).c_str());
//now snInHex contains serial number in hexadecimal string
Дополнительная функция - serial number
как номер! Когда вам нужен серийный номер в качестве данных (например, длясоздать xades
файл):
unsigned int sNumber;
std::stringstream ss;
ss << std::hex << snInHex.c_str();
ss >> sNumber;
//now serial number is stored as number in sNumber
Редактировать
string_to_hec
функция была взята отсюда: C ++ преобразовать строку в шестнадцатеричное и наоборот