ТЕЛО ЗАПРОСА IPP ДЛЯ ОТПРАВКИ ДОКУМЕНТА IPP 2.0 [закрыто] ⇐ C++
ТЕЛО ЗАПРОСА IPP ДЛЯ ОТПРАВКИ ДОКУМЕНТА IPP 2.0 [закрыто]
Глядя на этот код:
// Преобразуем TCHAR* в std::wstring std::wstring w_tcFileName(m_tcFileName); // Преобразуем std::wstring в std::string std::string fileName(w_tcFileName.begin(), w_tcFileName.end()); // Читаем файл для печати std::ifstream fileStream(pClientSocketContextEx->get_data_file(), std::ios::binary); std::vector fileData((std::istreambuf_iterator(fileStream)), std::istreambuf_iterator()); int requestId = pClientSocketContextEx->get_request_id(); // Вы можете использовать любое целочисленное значение // Преобразуем целое число в байты (при условии, что целое число 32-битное) std::vector requestIdBytes; requestIdBytes.push_back((requestId >> 24) & 0xFF); // Самый старший байт requestIdBytes.push_back((requestId >> 16) & 0xFF); requestIdBytes.push_back((requestId >> 8) и 0xFF); requestIdBytes.push_back (requestId и 0xFF); // Младший значащий байт // Версия IPP и идентификатор операции std::vector ippRequestHeader = { 0x01, 0x01, 0x00, 0x06, // Версия (1.1) и идентификатор операции (0x0006 для отправки документа) static_cast((requestId >> 24) и 0xFF), static_cast((requestId >> 16) и 0xFF), static_cast((requestId >> 8) и 0xFF), static_cast( requestId & 0xFF) // Байты идентификатора запроса }; std::string ippRequestBody; // Добавляем дополнительные атрибуты IPP явно, следуя стандартному порядку // набор атрибутов-кодировки (кодировка) = utf-8 std::string атрибутыCharset = "набор атрибутов-кодировки"; std::string атрибутыCharsetVal = "utf-8"; ippRequestBody += { 0x01, 0x47, static_cast(attributesCharset.size() >> 8), static_cast(attributesCharset.size() и 0xFF) }; ippRequestBody += атрибутыCharset; ippRequestBody += { static_cast(attributesCharsetVal.size() >> 8), static_cast(attributesCharsetVal.size() и 0xFF) }; ippRequestBody += атрибутыCharsetVal; // атрибуты-естественный-язык (naturalLanguage) = en std::string атрибутыNaturalLanguage = "атрибуты-естественный-язык"; std::string атрибутыNaturalLanguageVal = "en"; ippRequestBody += { 0x48, static_cast(attributesNaturalLanguage.size() >> 8), static_cast(attributesNaturalLanguage.size() и 0xFF) }; ippRequestBody += атрибутыNaturalLanguage; ippRequestBody += { static_cast(attributesNaturalLanguageVal.size() >> 8), static_cast(attributesNaturalLanguageVal.size() и 0xFF) }; ippRequestBody += атрибутыNaturalLanguageVal; // принтер-uri (uri) = std::string printUri = "принтер-uri"; std::string printUriVal = "ipp://" + хост + "/ipp/print"; ippRequestBody += { 0x45, static_cast(printerUri.size() >> 8), static_cast(printerUri.size() и 0xFF) }; ippRequestBody += PrinterUri; ippRequestBody += { static_cast(printerUriVal.size() >> 8), static_cast(printerUriVal.size() и 0xFF) }; ippRequestBody += printUriVal; // Определить атрибут job-id и его значение (при условии, что оно целое число) std::string jobId = "идентификатор задания"; int jobIdVal = static_cast(jobID); // Заменяем фактическим идентификатором задания // Вычисляем размер значения атрибута job-id size_t jobIdSize = sizeof (jobIdVal); // Добавляем тег, длину и значение атрибута job-id в ippRequestBody ippRequestBody += { 0x21, 0x02, // Тег атрибута для идентификатора задания (целое число) static_cast(jobIdSize >> 8), static_cast(jobIdSize & 0xFF) // Длина значения атрибута }; // Добавляем имя атрибута ippRequestBody += идентификатор задания; // Добавляем значение атрибута (идентификатор задания) в сетевом порядке байтов (обратный порядок байтов) char jobIdBytes [sizeof (jobIdVal)]; jobIdBytes[0] = static_cast((jobIdVal >> 24) & 0xFF); jobIdBytes[1] = static_cast((jobIdVal >> 16) & 0xFF); jobIdBytes[2] = static_cast((jobIdVal >> 8) & 0xFF); jobIdBytes[3] = static_cast(jobIdVal & 0xFF); ippRequestBody += jobIdBytes; // имя-запрашивающего-пользователя (nameWithoutLanguage) = Processfusion std::string requestingUserName = "имя-запрашивающего-пользователя"; std::string requestingUserNameVal = "TEST"; ippRequestBody += { 0x42, static_cast(requestingUserName.size() >> 8), static_cast(requestingUserName.size() и 0xFF) }; ippRequestBody += RequestingUserName; ippRequestBody += { static_cast(requestingUserNameVal.size() >> 8), static_cast(requestingUserNameVal.size() & 0xFF) }; ippRequestBody += RequestingUserNameVal; // формат документа (mimeMediaType) = application/pdf std::string documentFormat = "формат-документа"; std::string documentFormatVal = "application/pdf"; ippRequestBody += { 0x04, 0x40, static_cast(documentFormat.size() >> 8), static_cast(documentFormat.size() и 0xFF) }; ippRequestBody += DocumentFormat; ippRequestBody += { 0x04, 0x40, static_cast(documentFormatVal.size() >> 8), static_cast(documentFormatVal.size() и 0xFF) }; ippRequestBody += documentFormatVal; // последний документ (логическое значение) = true std::string LastDocument = "Последний документ"; Bool LastDocumentVal = Истина; // Устанавливаем значение true для логического значения ippRequestBody += { 0x22, 0x01, static_cast(lastDocument.size() >> 8), static_cast(lastDocument.size() и 0xFF) }; ippRequestBody += LastDocument; ippRequestBody += { static_cast(lastDocumentVal? 1: 0), 0x00 }; // Вычисляем длину данных файла (при условии, что «fileData» содержит ваши данные PDF) int dataLength = static_cast(fileData.size()); // Добавляем атрибут данных (с тегом data) и заполнитель для длины (4 байта) ippRequestBody += { 0x04, 0x00, 0x00, 0x00, 0x00 // тег данных (4 байта) + заполнитель для длины (4 байта) }; // Сохраняем позицию, в которую будет вставлена длина данных std::size_t dataLengthPosition = ippRequestBody.size(); // Добавляем фактические данные файла ippRequestBody.insert(ippRequestBody.end(), fileData.begin(), fileData.end()); // Вычисляем фактическую длину данных и обновляем ее в теле запроса dataLength = static_cast(fileData.size()); ippRequestBody[dataLengthPosition + 1] = (dataLength >> 24) & 0xFF; ippRequestBody[dataLengthPosition + 2] = (dataLength >> 16) & 0xFF; ippRequestBody[dataLengthPosition + 3] = (dataLength >> 8) & 0xFF; ippRequestBody [dataLengthPosition + 4] = dataLength & 0xFF; // Добавляем конец тега атрибутов ippRequestBody += { 0x03 // тег завершения }; ...Я не знаю, почему я не получил успешного ответа. Единственными виновниками могут быть; реализация идентификатора задания, формата документа, последнего документа или фактических данных из файла.
Помогите мне это исправить.
Мне не совсем понятно, почему мой код неправильно объединяет запрос?
Глядя на этот код:
// Преобразуем TCHAR* в std::wstring std::wstring w_tcFileName(m_tcFileName); // Преобразуем std::wstring в std::string std::string fileName(w_tcFileName.begin(), w_tcFileName.end()); // Читаем файл для печати std::ifstream fileStream(pClientSocketContextEx->get_data_file(), std::ios::binary); std::vector fileData((std::istreambuf_iterator(fileStream)), std::istreambuf_iterator()); int requestId = pClientSocketContextEx->get_request_id(); // Вы можете использовать любое целочисленное значение // Преобразуем целое число в байты (при условии, что целое число 32-битное) std::vector requestIdBytes; requestIdBytes.push_back((requestId >> 24) & 0xFF); // Самый старший байт requestIdBytes.push_back((requestId >> 16) & 0xFF); requestIdBytes.push_back((requestId >> 8) и 0xFF); requestIdBytes.push_back (requestId и 0xFF); // Младший значащий байт // Версия IPP и идентификатор операции std::vector ippRequestHeader = { 0x01, 0x01, 0x00, 0x06, // Версия (1.1) и идентификатор операции (0x0006 для отправки документа) static_cast((requestId >> 24) и 0xFF), static_cast((requestId >> 16) и 0xFF), static_cast((requestId >> 8) и 0xFF), static_cast( requestId & 0xFF) // Байты идентификатора запроса }; std::string ippRequestBody; // Добавляем дополнительные атрибуты IPP явно, следуя стандартному порядку // набор атрибутов-кодировки (кодировка) = utf-8 std::string атрибутыCharset = "набор атрибутов-кодировки"; std::string атрибутыCharsetVal = "utf-8"; ippRequestBody += { 0x01, 0x47, static_cast(attributesCharset.size() >> 8), static_cast(attributesCharset.size() и 0xFF) }; ippRequestBody += атрибутыCharset; ippRequestBody += { static_cast(attributesCharsetVal.size() >> 8), static_cast(attributesCharsetVal.size() и 0xFF) }; ippRequestBody += атрибутыCharsetVal; // атрибуты-естественный-язык (naturalLanguage) = en std::string атрибутыNaturalLanguage = "атрибуты-естественный-язык"; std::string атрибутыNaturalLanguageVal = "en"; ippRequestBody += { 0x48, static_cast(attributesNaturalLanguage.size() >> 8), static_cast(attributesNaturalLanguage.size() и 0xFF) }; ippRequestBody += атрибутыNaturalLanguage; ippRequestBody += { static_cast(attributesNaturalLanguageVal.size() >> 8), static_cast(attributesNaturalLanguageVal.size() и 0xFF) }; ippRequestBody += атрибутыNaturalLanguageVal; // принтер-uri (uri) = std::string printUri = "принтер-uri"; std::string printUriVal = "ipp://" + хост + "/ipp/print"; ippRequestBody += { 0x45, static_cast(printerUri.size() >> 8), static_cast(printerUri.size() и 0xFF) }; ippRequestBody += PrinterUri; ippRequestBody += { static_cast(printerUriVal.size() >> 8), static_cast(printerUriVal.size() и 0xFF) }; ippRequestBody += printUriVal; // Определить атрибут job-id и его значение (при условии, что оно целое число) std::string jobId = "идентификатор задания"; int jobIdVal = static_cast(jobID); // Заменяем фактическим идентификатором задания // Вычисляем размер значения атрибута job-id size_t jobIdSize = sizeof (jobIdVal); // Добавляем тег, длину и значение атрибута job-id в ippRequestBody ippRequestBody += { 0x21, 0x02, // Тег атрибута для идентификатора задания (целое число) static_cast(jobIdSize >> 8), static_cast(jobIdSize & 0xFF) // Длина значения атрибута }; // Добавляем имя атрибута ippRequestBody += идентификатор задания; // Добавляем значение атрибута (идентификатор задания) в сетевом порядке байтов (обратный порядок байтов) char jobIdBytes [sizeof (jobIdVal)]; jobIdBytes[0] = static_cast((jobIdVal >> 24) & 0xFF); jobIdBytes[1] = static_cast((jobIdVal >> 16) & 0xFF); jobIdBytes[2] = static_cast((jobIdVal >> 8) & 0xFF); jobIdBytes[3] = static_cast(jobIdVal & 0xFF); ippRequestBody += jobIdBytes; // имя-запрашивающего-пользователя (nameWithoutLanguage) = Processfusion std::string requestingUserName = "имя-запрашивающего-пользователя"; std::string requestingUserNameVal = "TEST"; ippRequestBody += { 0x42, static_cast(requestingUserName.size() >> 8), static_cast(requestingUserName.size() и 0xFF) }; ippRequestBody += RequestingUserName; ippRequestBody += { static_cast(requestingUserNameVal.size() >> 8), static_cast(requestingUserNameVal.size() & 0xFF) }; ippRequestBody += RequestingUserNameVal; // формат документа (mimeMediaType) = application/pdf std::string documentFormat = "формат-документа"; std::string documentFormatVal = "application/pdf"; ippRequestBody += { 0x04, 0x40, static_cast(documentFormat.size() >> 8), static_cast(documentFormat.size() и 0xFF) }; ippRequestBody += DocumentFormat; ippRequestBody += { 0x04, 0x40, static_cast(documentFormatVal.size() >> 8), static_cast(documentFormatVal.size() и 0xFF) }; ippRequestBody += documentFormatVal; // последний документ (логическое значение) = true std::string LastDocument = "Последний документ"; Bool LastDocumentVal = Истина; // Устанавливаем значение true для логического значения ippRequestBody += { 0x22, 0x01, static_cast(lastDocument.size() >> 8), static_cast(lastDocument.size() и 0xFF) }; ippRequestBody += LastDocument; ippRequestBody += { static_cast(lastDocumentVal? 1: 0), 0x00 }; // Вычисляем длину данных файла (при условии, что «fileData» содержит ваши данные PDF) int dataLength = static_cast(fileData.size()); // Добавляем атрибут данных (с тегом data) и заполнитель для длины (4 байта) ippRequestBody += { 0x04, 0x00, 0x00, 0x00, 0x00 // тег данных (4 байта) + заполнитель для длины (4 байта) }; // Сохраняем позицию, в которую будет вставлена длина данных std::size_t dataLengthPosition = ippRequestBody.size(); // Добавляем фактические данные файла ippRequestBody.insert(ippRequestBody.end(), fileData.begin(), fileData.end()); // Вычисляем фактическую длину данных и обновляем ее в теле запроса dataLength = static_cast(fileData.size()); ippRequestBody[dataLengthPosition + 1] = (dataLength >> 24) & 0xFF; ippRequestBody[dataLengthPosition + 2] = (dataLength >> 16) & 0xFF; ippRequestBody[dataLengthPosition + 3] = (dataLength >> 8) & 0xFF; ippRequestBody [dataLengthPosition + 4] = dataLength & 0xFF; // Добавляем конец тега атрибутов ippRequestBody += { 0x03 // тег завершения }; ...Я не знаю, почему я не получил успешного ответа. Единственными виновниками могут быть; реализация идентификатора задания, формата документа, последнего документа или фактических данных из файла.
Помогите мне это исправить.
Мне не совсем понятно, почему мой код неправильно объединяет запрос?
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Если я отправляю DLL, использующую библиотеку IPP, должен ли я также отправлять DLL IPP?
Anonymous » » в форуме C++ - 0 Ответы
- 21 Просмотры
-
Последнее сообщение Anonymous
-