Ich schreibe eine C++ - Klasse, um eine digitale Signatur zu einer PDF hinzuzufügen, mit OpenSSL, um einen SHA1-Hash zu generieren, den ich dann in eine Datei drucken:std :: Ofstream druckt zusätzliche Bytes, wenn ein Array unsigned char gegeben, aber nur im Freigabemodus
unsigned char hash[SHA_DIGEST_LENGTH];
SHA1((unsigned char *)temp.c_str(), temp.size(), hash);
std::ofstream fout("resources/hash.out", std::ios::binary);
fout << hash;
fout.close();
Dieser Code funktioniert wie erwartet im Debug-Modus. Im Release-Modus, 30 fout << hash
druckt statt SHA_DIGEST_LENGTH = 20 Bytes, die letzten 10 davon wie Müll aussieht (vielleicht Pufferüberlauf?)
Meine aktuelle Problemumgehung ist jedes Zeichen anstelle von Streaming drucken:
for (int i=0; i<SHA_DIGEST_LENGTH; ++i)
fout.put(hash[i]);
Das funktioniert in beiden Build-Modi, aber ich bin gespannt, was könnte der Stream-Operator die Länge der Zeichenfolge falsch lesen. Hat jemand irgendwelche Gedanken?
Für den Datensatz kompiliere ich mit MSVC++ 12 (x86_amd64).
Does 'SHA1' Null-kündigen den Puffer? – aschepler
Beachten Sie auch, dass 'temp.size()' den Nullabschluss nicht enthält. – NathanOliver
Dies ist nicht C, also markieren Sie es nicht C. –