Загрузить сертификат и png в char * - PullRequest
1 голос
/ 15 февраля 2012

Я пытаюсь загрузить сертификат и файл png в char * в C ++:

char certPath[] = "./user.pem";
char dataPath[] = "./test.png";    
char *certificate = loadFile(certPath);
char *datafile = loadFile(dataPath);

И это мой метод loadFile () `:

char* loadFile(char* filename) {
    cout << endl << "Loading file: " << filename << endl;

    char *contents;
    ifstream file(filename, ios::in|ios::binary|ios::ate);
    if (file.is_open())
    {
        int size = file.tellg();
        contents = new char [size];
        file.seekg (0, ios::beg);
        file.read (contents, size);
        file.clear();
        file.close();
    }
    printf("contents: %s\n", contents);
    cout << endl << "finished loading " << filename << endl;

    return contents;
}

Это вывод, который он производит:

    Loading file: ./user.pem
contents: -----BEGIN CERTIFICATE-----
MIID+TCCAuGgAwIBAgIJAJhxZybSGGMgMA0GCSqGSIb3DQEBBQUAMIGSMQswCQYD
VQQGEwJBVDEPMA0GA1UECAwGU3R5cmlhMQ0wCwYDVQQHDARHcmF6MQowCAYDVQQK
DAEvMQowCAYDVQQLDAEvMR0wGwYDVQQDDBRDaHJpc3RvZiBTdHJvbWJlcmdlcjEs
MCoGCSqGSIb3DQEJARYdc3Ryb21iZXJnZXJAc3R1ZGVudC50dWdyYXouYXQwHhcN
MTIwMjE0MjEwMzA4WhcNMTMwMjEzMjEwMzA4WjCBkjELMAkGA1UEBhMCQVQxDzAN
BgNVBAgMBlN0eXJpYTENMAsGA1UEBwwER3JhejEKMAgGA1UECgwBLzEKMAgGA1UE
CwwBLzEdMBsGA1UEAwwUQ2hyaXN0b2YgU3Ryb21iZXJnZXIxLDAqBgkqhkiG9w0B
CQEWHXN0cm9tYmVyZ2VyQHN0dWRlbnQudHVncmF6LmF0MIIBIjANBgkqhkiG9w0B
AQEFAAOCAQ8AMIIBCgKCAQEA15ISaiXMSTVnmGtEF+bbhmVQk+4voU1pUZlOMVBj
QKjfPgCtgrmRaY8L+d6Pu61urFE1QrsfNJdDJRYs87Cc1eZgkvOXz0fSE2DHVNE2
i9YdFR8ea5niU5ATFZwiDIEhfCAcXWcEHWtZBB4yYYISsBkFxq6UBniGV+p7XOtE
aAtriBP0PZ4KUo+arJLStbwt4f9tBeytKowaKVNGlOpBgj7TG4bw8yA7Avdx8s+k
sReSxYteo0o9clIqISdKL0pRdzXP0Zrix54mBIfsxojfCW2SvqvLLLxtJlRKriQj
JfBc4koS6yAoktx7CvzcepGQk65ZGl0TNlteG4FJqy5yBQIDAQABo1AwTjAdBgNV
HQ4EFgQU1/g63xTix2Vs0zv2d3wVX9FGvVQwHwYDVR0jBBgwFoAU1/g63xTix2Vs
0zv2d3wVX9FGvVQwDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAHyvI
0L+ibesg45qUxx2OQb37HA9aRpR3wYpt6d5Rd1x2pfqumrKeV/42XWodZJSkU3sH
EX8V2xKwNoUBsPb/q54S9suCHwE33XtWjLvJyR9v2wd2HjNRYdGF9XoYdpsOpcAk
/kaZ2pExzLAPDg5pTsqY9dpCFWnyccZUO1CLEeljinOZ4raIj7d6EryWsn+u5pbs
WB12EFaoNCybQ6j5+TIcRs5xdGpVD6qMkm7HUnBn6mtz8Q7qVj9sqo5us4UBRWY8
ie9X494oW59nRuLiZ8dOPGuOXsuCILY44/3eyDh6yvW7G+wrp3eZ7L7eLRSI3+lm
mxqSJNq8Yi6ArfcB+Q==
-----END CERTIFICATE-----


finished loading ./user.pem

Loading file: ./test.png

Сначала должно появиться содержимое сертификата, а затем содержимое изображения.Сертификат работает, но когда я пытаюсь загрузить изображение, это действительно странно.Ничто не работает больше.Даже простой cout или printf не отображаются на консоли, но программа не падает ...

Есть предложения, что не так?

Ответы [ 3 ]

2 голосов
/ 15 февраля 2012

Существуют различные виды файлов PNG.Так что, возможно, изображение PNG имеет непечатный характер.Если это так, то он не будет печататься с использованием какой-либо функции печати, будь то printf или std::cout<<.

Однако вы можете напечатать шестнадцатеричные значения непечатаемого символа:

//write it inside the if-block
for(int i = 0 ; i < size; ++i)
      std::cout << std::hex << (int) contents[i];

Будет напечатано шестнадцатеричное значение каждого символа.

Вы можете проверить, печатается ли данный символ или нет, используя функцию isprint().

2 голосов
/ 15 февраля 2012

Ваша ошибка в том, что у вас \ 0 в начале заголовка PNG.

EDIT:

Изменение:

printf("contents: %s\n", contents);

Кому:

std::cout.write( contents, size );
std::cout.flush();

Конечно, вы также должны переместить размер в правильную область.

1 голос
/ 15 февраля 2012

Вы не можете распечатать содержимое png-файла на консоль, это двоичный файл, отличный от файла сертификата, который содержит сертификат в кодировке MIME и, следовательно, является обычным текстовым файлом.

Печатный файл (т. Е. Текст) содержит только байты, представляющие символы стандартного ASCII (0x20 - 0x7F), и использует символы форматирования ASCII (CR, LF и т. Д.) Предсказуемым образом.Кроме того, он не содержит байта 0x00, который используется в C / C ++ для обозначения конца строки.Бинарный файл может содержать любой байт в любом порядке.

Итак, при попытке напечатать его произойдут две вещи: a) он остановится на первом найденном байте 0x00;b) каждый байт, содержащий не-ASCII-символ, будет напечатан как специальный символ (если он находится в кодовой странице, активной для консоли) или вообще ничего, и байты, содержащие символы ASCII-форматирования, будут «выполняться», как если бы онибыло фактическое форматирование в текстовом файле.

Результат: либо вы вообще ничего не увидите, либо просто несколько странных символов, смешанных со случайными переводами строк, вкладками и т. д.

Чтобы иметьчто вы ожидаете, в первую очередь, чтобы точно определить, что это такое.Хотите увидеть содержимое png в MIME-кодировке?Затем вы должны использовать подпрограмму MIME-кодирования (например, this ).Или вы хотите напечатать шестнадцатеричное значение каждого байта?Затем вам нужно сделать std::cout << std::hex << byte (как предложил Nawaz) или printf("%02x") для каждого байта в цикле.

Также для файла сертификата вы должны открыть его как текстовый файл, а не как двоичный файл.В противном случае у вас будет два нежелательных эффекта: нет нормализации LF (например, в Windows EOL помечен CR + LF, а в Unix / Linux это просто LF) и нет обработки для EOF char.

...