Related
I'm having trouble using OpenSSL to parse certificates from bytes acquired from a pcap file. The data is coming directly from ssl.handshake.certificate field in Wireshark (when observing the pcap).
The raw data is from a pcap file i found from Wireshark. This is just the 10th packet and is a certificate with a commonName 'Ubuntu'. I believe my problem is that i'm giving the OpenSSL function data that is incorrectly formatted but i wouldve thought that it could handle network order bytes (as i have directly from a pcap).
const unsigned int raw[] = {
0x30, 0x82, 0x02, 0xb2, 0x30, 0x82, 0x01, 0x9a,
0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x09, 0x00,
0xcd, 0xdb, 0x2b, 0xb3, 0xe2, 0xa7, 0x1b, 0x88,
0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86,
0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x30,
0x11, 0x31, 0x0f, 0x30, 0x0d, 0x06, 0x03, 0x55,
0x04, 0x03, 0x13, 0x06, 0x75, 0x62, 0x75, 0x6e,
0x74, 0x75, 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x35,
0x30, 0x31, 0x32, 0x37, 0x31, 0x36, 0x35, 0x35,
0x30, 0x31, 0x5a, 0x17, 0x0d, 0x32, 0x35, 0x30,
0x31, 0x32, 0x34, 0x31, 0x36, 0x35, 0x35, 0x30,
0x31, 0x5a, 0x30, 0x11, 0x31, 0x0f, 0x30, 0x0d,
0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x06, 0x75,
0x62, 0x75, 0x6e, 0x74, 0x75, 0x30, 0x82, 0x01,
0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48,
0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00,
0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01,
0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xf1, 0x85,
0x02, 0x0b, 0x26, 0x3d, 0x2d, 0xcd, 0xcc, 0x75,
0xc2, 0x1d, 0x51, 0x19, 0x7c, 0x1d, 0xbc, 0x1e,
0x14, 0xe5, 0x71, 0x6f, 0xfb, 0xaa, 0x2a, 0x8b,
0x2f, 0x69, 0xe3, 0xe7, 0xc7, 0xa4, 0xc4, 0x79,
0xef, 0x17, 0x0e, 0x4b, 0x37, 0xd8, 0x68, 0x00,
0x81, 0x6a, 0x62, 0x55, 0x79, 0x1d, 0x1d, 0x73,
0x6d, 0xbb, 0x20, 0x43, 0x4e, 0x21, 0x8b, 0xe8,
0x67, 0xb6, 0x0e, 0xfd, 0xde, 0x15, 0x18, 0xff,
0x9f, 0x0d, 0x2b, 0xf6, 0x61, 0xd5, 0x51, 0x1c,
0xfe, 0x5e, 0xca, 0x7f, 0xdc, 0x16, 0xc8, 0x4f,
0x36, 0x3d, 0x17, 0x4b, 0x85, 0x53, 0x2e, 0x85,
0x04, 0x7c, 0xa3, 0x02, 0xdd, 0xf2, 0x9b, 0x86,
0xcd, 0x98, 0x64, 0xd4, 0xcd, 0x10, 0x25, 0x79,
0xd6, 0x81, 0x36, 0x40, 0x72, 0xd3, 0xfd, 0x06,
0xff, 0x55, 0x79, 0x0b, 0xc3, 0x07, 0x7a, 0x04,
0xd3, 0x9a, 0x80, 0x92, 0xd2, 0x33, 0x82, 0x63,
0x87, 0x1f, 0xae, 0x9f, 0xb3, 0x9e, 0x01, 0x41,
0x07, 0x42, 0x02, 0x25, 0x9d, 0x29, 0xb8, 0x67,
0xa0, 0x02, 0xf5, 0x57, 0x63, 0xd6, 0xc1, 0x41,
0x5c, 0x5d, 0x74, 0x5d, 0x75, 0x17, 0x3a, 0xce,
0xd8, 0xb2, 0x9f, 0x4a, 0x66, 0x6b, 0x4c, 0x4e,
0x28, 0xf1, 0x2f, 0x74, 0x86, 0xdf, 0xe3, 0x9a,
0x3d, 0x8e, 0xbd, 0x7e, 0x03, 0xf9, 0x8d, 0x42,
0xa1, 0xe9, 0xa3, 0x58, 0xca, 0x26, 0xdb, 0xae,
0xbb, 0x47, 0x4a, 0x81, 0x98, 0x80, 0xee, 0x54,
0x04, 0x93, 0x22, 0xa8, 0x6a, 0xb1, 0xb8, 0x13,
0x14, 0xa4, 0x90, 0x99, 0x51, 0x3d, 0x30, 0xd3,
0x9a, 0xd1, 0x46, 0xc4, 0x79, 0x74, 0xe5, 0x6d,
0x4f, 0xde, 0xb8, 0xa6, 0x90, 0xb1, 0x75, 0x67,
0x16, 0xf0, 0x0e, 0x4b, 0x15, 0xfa, 0x9f, 0xbf,
0x65, 0x48, 0x2d, 0x27, 0x00, 0x3a, 0x86, 0x73,
0x49, 0xa5, 0xd9, 0x01, 0x56, 0x5f, 0x02, 0x03,
0x01, 0x00, 0x01, 0xa3, 0x0d, 0x30, 0x0b, 0x30,
0x09, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x04, 0x02,
0x30, 0x00, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86,
0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05,
0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0x1d, 0x14,
0x29, 0xa8, 0x5f, 0x81, 0x2b, 0xae, 0x61, 0x36,
0x7b, 0x44, 0xbb, 0xc1, 0xa2, 0x11, 0x23, 0x21,
0x43, 0x98, 0xee, 0x42, 0xfa, 0x90, 0x01, 0x5a,
0xde, 0xd6, 0x80, 0x1f, 0xa4, 0x49, 0x4b, 0xaf,
0xf8, 0x9d, 0xb8, 0xa3, 0xc8, 0xf2, 0x0f, 0xdb,
0x33, 0x6d, 0xd7, 0x29, 0x6f, 0xda, 0xe3, 0x06,
0x51, 0xab, 0xbf, 0xd2, 0xb1, 0xee, 0x89, 0x24,
0x2c, 0x00, 0x5f, 0x71, 0x0a, 0xc9, 0xba, 0xde,
0x61, 0xa0, 0x82, 0x7e, 0x40, 0xb8, 0xbf, 0xd3,
0x75, 0x9a, 0xab, 0x96, 0x77, 0xb1, 0x8e, 0x1c,
0xad, 0xf7, 0x36, 0xbb, 0xfc, 0xc3, 0x30, 0x58,
0x38, 0x19, 0x19, 0x3a, 0xdd, 0xdb, 0x03, 0xed,
0x5a, 0x31, 0xb9, 0x74, 0x06, 0x63, 0x95, 0x41,
0x48, 0x66, 0x41, 0x63, 0xf5, 0x0b, 0x5d, 0x82,
0xe4, 0xaf, 0xfc, 0x47, 0x17, 0xed, 0x4e, 0xe3,
0x8d, 0x62, 0xf9, 0x6a, 0xec, 0xcb, 0xbb, 0x2c,
0xe7, 0x8c, 0x30, 0x49, 0xfa, 0x5f, 0xda, 0xdc,
0x18, 0x14, 0x9a, 0x9a, 0x7a, 0x0f, 0xbf, 0x47,
0x22, 0x46, 0x00, 0x7b, 0xf9, 0xed, 0xd8, 0x52,
0x48, 0x32, 0x84, 0x93, 0x41, 0x50, 0x2f, 0x31,
0xf6, 0x1d, 0xfc, 0x69, 0x0d, 0x30, 0xd0, 0xda,
0x44, 0x65, 0x85, 0xde, 0x0c, 0x2c, 0x92, 0x9c,
0x42, 0xd7, 0x40, 0xe2, 0xbc, 0x7d, 0xd3, 0x93,
0xad, 0x63, 0x42, 0xe3, 0x95, 0xc4, 0xaf, 0xa2,
0x3d, 0xd6, 0x02, 0x1c, 0xf9, 0x28, 0xd2, 0xe8,
0x18, 0xa0, 0x6f, 0xb0, 0x42, 0x4c, 0x9a, 0x75,
0xca, 0x49, 0xb6, 0xa2, 0x66, 0x3d, 0xa2, 0x21,
0x76, 0xfa, 0xbd, 0xe6, 0x66, 0x73, 0x04, 0x35,
0xde, 0x6b, 0x1a, 0xb9, 0x3f, 0xa0, 0x06, 0xd5,
0x39, 0x0e, 0xc3, 0xfa, 0xe2, 0x6f, 0x7f, 0xb3,
0x4d, 0xee, 0x54, 0x38, 0x78, 0x3b, 0x1b, 0x2e,
0x71, 0xc2, 0xc5, 0x2d, 0xca, 0xf1
};
const unsigned char* data = reinterpret_cast<const unsigned char*>(raw);
size_t len = sizeof(raw)/sizeof(raw[0]);
X509 *cert = d2i_X509(NULL, &data, len);
This will always return cert as NULL and i'm stuck because this seemed like a simple procedure.
Your raw array is the wrong type. That is supposed to be a sequence of simple octets (unsigned char, uint8_t, pick your poison).
Changed as described above, the certificate is extracted successfully:
Code
#include <stdio.h>
#include <openssl/evp.h>
#include <openssl/x509.h>
const unsigned char raw[] = // <<======= HERE
{
0x30, 0x82, 0x02, 0xb2, 0x30, 0x82, 0x01, 0x9a,
0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x09, 0x00,
0xcd, 0xdb, 0x2b, 0xb3, 0xe2, 0xa7, 0x1b, 0x88,
0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86,
0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x30,
0x11, 0x31, 0x0f, 0x30, 0x0d, 0x06, 0x03, 0x55,
0x04, 0x03, 0x13, 0x06, 0x75, 0x62, 0x75, 0x6e,
0x74, 0x75, 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x35,
0x30, 0x31, 0x32, 0x37, 0x31, 0x36, 0x35, 0x35,
0x30, 0x31, 0x5a, 0x17, 0x0d, 0x32, 0x35, 0x30,
0x31, 0x32, 0x34, 0x31, 0x36, 0x35, 0x35, 0x30,
0x31, 0x5a, 0x30, 0x11, 0x31, 0x0f, 0x30, 0x0d,
0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x06, 0x75,
0x62, 0x75, 0x6e, 0x74, 0x75, 0x30, 0x82, 0x01,
0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48,
0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00,
0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01,
0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xf1, 0x85,
0x02, 0x0b, 0x26, 0x3d, 0x2d, 0xcd, 0xcc, 0x75,
0xc2, 0x1d, 0x51, 0x19, 0x7c, 0x1d, 0xbc, 0x1e,
0x14, 0xe5, 0x71, 0x6f, 0xfb, 0xaa, 0x2a, 0x8b,
0x2f, 0x69, 0xe3, 0xe7, 0xc7, 0xa4, 0xc4, 0x79,
0xef, 0x17, 0x0e, 0x4b, 0x37, 0xd8, 0x68, 0x00,
0x81, 0x6a, 0x62, 0x55, 0x79, 0x1d, 0x1d, 0x73,
0x6d, 0xbb, 0x20, 0x43, 0x4e, 0x21, 0x8b, 0xe8,
0x67, 0xb6, 0x0e, 0xfd, 0xde, 0x15, 0x18, 0xff,
0x9f, 0x0d, 0x2b, 0xf6, 0x61, 0xd5, 0x51, 0x1c,
0xfe, 0x5e, 0xca, 0x7f, 0xdc, 0x16, 0xc8, 0x4f,
0x36, 0x3d, 0x17, 0x4b, 0x85, 0x53, 0x2e, 0x85,
0x04, 0x7c, 0xa3, 0x02, 0xdd, 0xf2, 0x9b, 0x86,
0xcd, 0x98, 0x64, 0xd4, 0xcd, 0x10, 0x25, 0x79,
0xd6, 0x81, 0x36, 0x40, 0x72, 0xd3, 0xfd, 0x06,
0xff, 0x55, 0x79, 0x0b, 0xc3, 0x07, 0x7a, 0x04,
0xd3, 0x9a, 0x80, 0x92, 0xd2, 0x33, 0x82, 0x63,
0x87, 0x1f, 0xae, 0x9f, 0xb3, 0x9e, 0x01, 0x41,
0x07, 0x42, 0x02, 0x25, 0x9d, 0x29, 0xb8, 0x67,
0xa0, 0x02, 0xf5, 0x57, 0x63, 0xd6, 0xc1, 0x41,
0x5c, 0x5d, 0x74, 0x5d, 0x75, 0x17, 0x3a, 0xce,
0xd8, 0xb2, 0x9f, 0x4a, 0x66, 0x6b, 0x4c, 0x4e,
0x28, 0xf1, 0x2f, 0x74, 0x86, 0xdf, 0xe3, 0x9a,
0x3d, 0x8e, 0xbd, 0x7e, 0x03, 0xf9, 0x8d, 0x42,
0xa1, 0xe9, 0xa3, 0x58, 0xca, 0x26, 0xdb, 0xae,
0xbb, 0x47, 0x4a, 0x81, 0x98, 0x80, 0xee, 0x54,
0x04, 0x93, 0x22, 0xa8, 0x6a, 0xb1, 0xb8, 0x13,
0x14, 0xa4, 0x90, 0x99, 0x51, 0x3d, 0x30, 0xd3,
0x9a, 0xd1, 0x46, 0xc4, 0x79, 0x74, 0xe5, 0x6d,
0x4f, 0xde, 0xb8, 0xa6, 0x90, 0xb1, 0x75, 0x67,
0x16, 0xf0, 0x0e, 0x4b, 0x15, 0xfa, 0x9f, 0xbf,
0x65, 0x48, 0x2d, 0x27, 0x00, 0x3a, 0x86, 0x73,
0x49, 0xa5, 0xd9, 0x01, 0x56, 0x5f, 0x02, 0x03,
0x01, 0x00, 0x01, 0xa3, 0x0d, 0x30, 0x0b, 0x30,
0x09, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x04, 0x02,
0x30, 0x00, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86,
0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05,
0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0x1d, 0x14,
0x29, 0xa8, 0x5f, 0x81, 0x2b, 0xae, 0x61, 0x36,
0x7b, 0x44, 0xbb, 0xc1, 0xa2, 0x11, 0x23, 0x21,
0x43, 0x98, 0xee, 0x42, 0xfa, 0x90, 0x01, 0x5a,
0xde, 0xd6, 0x80, 0x1f, 0xa4, 0x49, 0x4b, 0xaf,
0xf8, 0x9d, 0xb8, 0xa3, 0xc8, 0xf2, 0x0f, 0xdb,
0x33, 0x6d, 0xd7, 0x29, 0x6f, 0xda, 0xe3, 0x06,
0x51, 0xab, 0xbf, 0xd2, 0xb1, 0xee, 0x89, 0x24,
0x2c, 0x00, 0x5f, 0x71, 0x0a, 0xc9, 0xba, 0xde,
0x61, 0xa0, 0x82, 0x7e, 0x40, 0xb8, 0xbf, 0xd3,
0x75, 0x9a, 0xab, 0x96, 0x77, 0xb1, 0x8e, 0x1c,
0xad, 0xf7, 0x36, 0xbb, 0xfc, 0xc3, 0x30, 0x58,
0x38, 0x19, 0x19, 0x3a, 0xdd, 0xdb, 0x03, 0xed,
0x5a, 0x31, 0xb9, 0x74, 0x06, 0x63, 0x95, 0x41,
0x48, 0x66, 0x41, 0x63, 0xf5, 0x0b, 0x5d, 0x82,
0xe4, 0xaf, 0xfc, 0x47, 0x17, 0xed, 0x4e, 0xe3,
0x8d, 0x62, 0xf9, 0x6a, 0xec, 0xcb, 0xbb, 0x2c,
0xe7, 0x8c, 0x30, 0x49, 0xfa, 0x5f, 0xda, 0xdc,
0x18, 0x14, 0x9a, 0x9a, 0x7a, 0x0f, 0xbf, 0x47,
0x22, 0x46, 0x00, 0x7b, 0xf9, 0xed, 0xd8, 0x52,
0x48, 0x32, 0x84, 0x93, 0x41, 0x50, 0x2f, 0x31,
0xf6, 0x1d, 0xfc, 0x69, 0x0d, 0x30, 0xd0, 0xda,
0x44, 0x65, 0x85, 0xde, 0x0c, 0x2c, 0x92, 0x9c,
0x42, 0xd7, 0x40, 0xe2, 0xbc, 0x7d, 0xd3, 0x93,
0xad, 0x63, 0x42, 0xe3, 0x95, 0xc4, 0xaf, 0xa2,
0x3d, 0xd6, 0x02, 0x1c, 0xf9, 0x28, 0xd2, 0xe8,
0x18, 0xa0, 0x6f, 0xb0, 0x42, 0x4c, 0x9a, 0x75,
0xca, 0x49, 0xb6, 0xa2, 0x66, 0x3d, 0xa2, 0x21,
0x76, 0xfa, 0xbd, 0xe6, 0x66, 0x73, 0x04, 0x35,
0xde, 0x6b, 0x1a, 0xb9, 0x3f, 0xa0, 0x06, 0xd5,
0x39, 0x0e, 0xc3, 0xfa, 0xe2, 0x6f, 0x7f, 0xb3,
0x4d, 0xee, 0x54, 0x38, 0x78, 0x3b, 0x1b, 0x2e,
0x71, 0xc2, 0xc5, 0x2d, 0xca, 0xf1
};
int main()
{
OpenSSL_add_all_ciphers();
OpenSSL_add_all_digests();
OpenSSL_add_all_algorithms();
const unsigned char *data = raw;
size_t len = sizeof(raw) / sizeof(raw[0]);
X509 *cert = d2i_X509(NULL, &data, (long)len);
printf("%p\n", cert);
if (cert)
{
X509_NAME *name = X509_get_issuer_name(cert);
if (name)
printf("Issuer: %s\n", X509_NAME_oneline(name, NULL, 0));
X509_free(cert);
}
return 0;
}
Output (pointer value varies)
0000018ACA51BEB0
Issuer: /CN=ubuntu
Instead of using 'png_init_io' I'm trying to use 'png_set_read_fn' to provide a custom function to load a byte array from memory instead of from file.
Why would this be happening.. It seems to be failing at:
if (setjmp(png_jmpbuf(png_ctx)) != 0)
{
png_destroy_read_struct(&png_ctx, &info_ctx, NULL);
free(img_data); free(row_data);
return (1); /* libpng feedback (?) */
}
This is my code so far, the PNG data is at the end of the file
#ifndef __EMBEDDEDPNG_H__
#define __EMBEDDEDPNG_H__
#include <png.h>
typedef struct {
const png_byte* data;
const png_size_t size;
} DataHandle;
typedef struct {
const DataHandle data;
png_size_t offset;
} ReadDataHandle;
#include <GL/gl.h>
#include <algorithm>
#define PNG_SIG_BYTES (8) /* bytes in the PNG file signature. */
using byte = unsigned char;
#define PNG_RGBA_PIXEL_LIMIT (0x1000000)
static int
png_rgba_pixel_limit(png_uint_32 w, png_uint_32 h)
{
double da;
/* assert(w != 0 && h != 0); */
if (w > PNG_RGBA_PIXEL_LIMIT || h > PNG_RGBA_PIXEL_LIMIT)
return (1); /* since both (w) and (h) are non-zero. */
/* since an IEEE-754 double has a 53 bit mantissa, it can
* represent the maximum area: (w * h == 2^48) exactly. */
da = ((double)w) * ((double)h);
if (da > ((double)PNG_RGBA_PIXEL_LIMIT))
return (1);
return (0); /* the PNG image is within the pixel limit. */
}
class EmbeddedPNG
{
public:
byte *Data;
public:
size_t Read(byte* dest, const size_t byteCount);
unsigned int Load(int &width, int &height);
};
void ReadDataFromInputStream(
png_structp png_ptr, png_byte* raw_data, png_size_t read_length) {
ReadDataHandle* handle = (ReadDataHandle*)png_get_io_ptr(png_ptr);
const png_byte* png_src = handle->data.data + handle->offset;
memcpy(raw_data, png_src, read_length);
handle->offset += read_length;
}
size_t EmbeddedPNG::Read(byte* dest, const size_t byteCount)
{
std::copy(Data + 0, Data + byteCount, dest);
return byteCount;
}
unsigned int EmbeddedPNG::Load(int &width, int &height)
{
png_byte magic[PNG_SIG_BYTES]; /* (signature byte buffer) */
png_structp png_ctx;
png_infop info_ctx;
png_uint_32 img_width, img_height, row;
png_byte img_depth, img_color_type;
/* 'volatile' qualifier forces reload in setjmp cleanup: */
png_byte *volatile img_data = NULL;
png_bytep *volatile row_data = NULL;
;//*buf = NULL;
/* it is assumed that 'longjmp' can be invoked within this
* code to efficiently unwind resources for *all* errors. */
/* PNG structures and resource unwinding: */
if ((png_ctx = png_create_read_struct(
PNG_LIBPNG_VER_STRING, NULL, NULL, NULL)) == NULL)
return (1); /* ENOMEM (?) */
if ((info_ctx = png_create_info_struct(png_ctx)) == NULL)
{
png_destroy_read_struct(&png_ctx, NULL, NULL);
return (1); /* ENOMEM (?) */
}
if (setjmp(png_jmpbuf(png_ctx)) != 0)
{
png_destroy_read_struct(&png_ctx, &info_ctx, NULL);
free(img_data); free(row_data);
return (1); /* libpng feedback (?) */
}
/* check PNG file signature: */
//if (fread(magic, (1), PNG_SIG_BYTES, fp) != PNG_SIG_BYTES)
// png_error(png_ctx, "invalid PNG file");
Read(magic, PNG_SIG_BYTES);
if (png_sig_cmp(magic, 0, PNG_SIG_BYTES))
png_error(png_ctx, "invalid PNG file");
/* set the input file stream and get the PNG image info: */
//png_init_io(png_ctx, fp);
ReadDataHandle a = ReadDataHandle{ { Data, 898 }, 0 };
png_set_read_fn(png_ctx, &a, ReadDataFromInputStream);
//png_set_read_fn(png_ptr, NULL, ReadDataFromInputStream);
png_set_sig_bytes(png_ctx, PNG_SIG_BYTES);
//////////////// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
png_read_info(png_ctx, info_ctx);
img_width = png_get_image_width(png_ctx, info_ctx);
img_height = png_get_image_height(png_ctx, info_ctx);
#if (1) /* PNG doesn't support zero area image? */
if (img_width == 0 || img_height == 0)
png_error(png_ctx, "zero area PNG image");
#endif
if (png_rgba_pixel_limit(img_width, img_height))
png_error(png_ctx, "PNG image exceeds pixel limits");
img_depth = png_get_bit_depth(png_ctx, info_ctx);
img_color_type = png_get_color_type(png_ctx, info_ctx);
/* ignored image interlacing, compression and filtering. */
/* force 8-bit color channels: */
if (img_depth == 16)
png_set_strip_16(png_ctx);
else if (img_depth < 8)
png_set_packing(png_ctx);
/* force formats to RGB: */
if (img_color_type != PNG_COLOR_TYPE_RGBA)
png_set_expand(png_ctx);
if (img_color_type == PNG_COLOR_TYPE_PALETTE)
png_set_palette_to_rgb(png_ctx);
if (img_color_type == PNG_COLOR_TYPE_GRAY)
png_set_gray_to_rgb(png_ctx);
if (img_color_type == PNG_COLOR_TYPE_GRAY_ALPHA)
png_set_gray_to_rgb(png_ctx);
/* add full opacity alpha channel if required: */
if (img_color_type != PNG_COLOR_TYPE_RGBA)
png_set_filler(png_ctx, 0xff, PNG_FILLER_AFTER);
/* apply the output transforms before reading image data: */
png_read_update_info(png_ctx, info_ctx);
/* allocate RGBA image data: */
img_data = (png_byte *)
malloc((size_t)(img_width * img_height * (4)));
if (img_data == NULL)
png_error(png_ctx, "error allocating image buffer");
/* allocate row pointers: */
row_data = (png_bytep *)
malloc((size_t)(img_height * sizeof(png_bytep)));
if (row_data == NULL)
png_error(png_ctx, "error allocating row pointers");
/* set the row pointers and read the RGBA image data: */
for (row = 0; row < img_height; row++)
row_data[row] = img_data +
(img_height - (row + 1)) * (img_width * (4));
png_read_image(png_ctx, row_data);
/* libpng and dynamic resource unwinding: */
png_read_end(png_ctx, NULL);
png_destroy_read_struct(&png_ctx, &info_ctx, NULL);
free(row_data);
//*w = (unsigned) img_width, *h = (unsigned) img_height;
width = img_width;
height = img_height;
//*buf = img_data; /* (asserts png_byte is an unsigned char) */
//Now generate the OpenGL texture object
GLuint texture;
glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1); // Important!
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0,
GL_RGBA, GL_UNSIGNED_BYTE, (GLvoid*)img_data);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
return texture;
}
class EmbeddedPNG_Icon_HandShake
: public EmbeddedPNG
{
public:
EmbeddedPNG_Icon_HandShake()
{
Data = new byte[898]{ 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A, 0x00, 0x00, 0x00, 0x0D, 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x20, 0x08, 0x04, 0x00, 0x00, 0x00, 0xD9, 0x73, 0xB2, 0x7F, 0x00, 0x00, 0x00, 0x04, 0x67, 0x41, 0x4D, 0x41, 0x00, 0x00, 0xB1, 0x8F, 0x0B, 0xFC, 0x61, 0x05, 0x00, 0x00, 0x00, 0x20, 0x63, 0x48, 0x52, 0x4D, 0x00, 0x00, 0x7A, 0x26, 0x00, 0x00, 0x80, 0x84, 0x00, 0x00, 0xFA, 0x00, 0x00, 0x00, 0x80, 0xE8, 0x00, 0x00, 0x75, 0x30, 0x00, 0x00, 0xEA, 0x60, 0x00, 0x00, 0x3A, 0x98, 0x00, 0x00, 0x17, 0x70, 0x9C, 0xBA, 0x51, 0x3C, 0x00, 0x00, 0x00, 0x02, 0x62, 0x4B, 0x47, 0x44, 0x00, 0x00, 0xAA, 0x8D, 0x23, 0x32, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x0D, 0xD7, 0x00, 0x00, 0x0D, 0xD7, 0x01, 0x42, 0x28, 0x9B, 0x78, 0x00, 0x00, 0x00, 0x07, 0x74, 0x49, 0x4D, 0x45, 0x07, 0xE1, 0x05, 0x1D, 0x15, 0x3A, 0x07, 0xDA, 0x7F, 0x48, 0xF4, 0x00, 0x00, 0x02, 0x50, 0x49, 0x44, 0x41, 0x54, 0x48, 0xC7, 0xD5, 0xD3, 0x4B, 0x68, 0x94, 0x57, 0x18, 0x06, 0xE0, 0x6F, 0x4C, 0x0C, 0x9A, 0xE2, 0x2D, 0x1A, 0xD1, 0x8A, 0x44, 0x57, 0x5A, 0xCD, 0xA2, 0xA8, 0xB1, 0x20, 0x8A, 0x97, 0x95, 0x08, 0x8A, 0x5D, 0xB4, 0x44, 0xC4, 0x8D, 0x08, 0xB6, 0x12, 0x21, 0x04, 0x84, 0xA2, 0x20, 0x48, 0xBB, 0xE8, 0xA2, 0x8B, 0x6E, 0x5A, 0x6C, 0xAD, 0x45, 0xB0, 0x14, 0x06, 0xB4, 0xA8, 0x64, 0x61, 0x16, 0x82, 0x08, 0x46, 0x4A, 0xB5, 0x68, 0x5C, 0x18, 0x35, 0xE8, 0xAC, 0x92, 0x8A, 0xA0, 0x62, 0xEE, 0x66, 0xC8, 0xD3, 0x45, 0x7E, 0xC7, 0xC9, 0xDC, 0x12, 0xBA, 0x28, 0xF8, 0xAD, 0x0E, 0x67, 0xCE, 0xFB, 0xF0, 0xFE, 0xE7, 0xFF, 0x27, 0xE2, 0x3D, 0x1A, 0xCB, 0x7C, 0xE7, 0x86, 0x83, 0x52, 0x53, 0x1D, 0x4C, 0x59, 0xA5, 0xD1, 0x5A, 0xB3, 0x26, 0xED, 0xAE, 0x90, 0xF1, 0xDC, 0x15, 0xFC, 0x58, 0x81, 0x50, 0xAD, 0x4D, 0x8F, 0x89, 0xC9, 0x7A, 0x20, 0xED, 0x84, 0xDD, 0x1A, 0x7C, 0xA0, 0x47, 0x9F, 0xD5, 0x11, 0xBE, 0xAA, 0x40, 0x98, 0xE9, 0x0F, 0x59, 0x69, 0xBB, 0x6D, 0xB5, 0xCB, 0x31, 0xE7, 0xDD, 0x35, 0x0A, 0x46, 0xB1, 0x31, 0x39, 0x55, 0x9E, 0xF0, 0x83, 0x37, 0x3E, 0x2D, 0xEA, 0xB4, 0x56, 0xB3, 0x8B, 0x68, 0xCD, 0xED, 0x95, 0x26, 0x2C, 0x34, 0xE4, 0x54, 0x99, 0x47, 0x9B, 0xE1, 0x37, 0xE3, 0xBE, 0xAC, 0x48, 0x68, 0x95, 0xF5, 0x61, 0xB2, 0xAE, 0x29, 0x22, 0xAA, 0xA6, 0x24, 0xA4, 0xDD, 0x4B, 0x56, 0x4D, 0x06, 0x0C, 0xCB, 0xF8, 0x53, 0x5A, 0x43, 0x45, 0xA2, 0x35, 0x1F, 0xB8, 0xE5, 0x62, 0xB2, 0xFA, 0xC6, 0x80, 0xAF, 0xFD, 0xEC, 0x92, 0xE7, 0x9E, 0x96, 0x26, 0x1C, 0x50, 0xED, 0xAC, 0xC7, 0x61, 0xA9, 0xDA, 0xE4, 0xE7, 0xAB, 0x1E, 0x4A, 0x45, 0x98, 0xED, 0x91, 0x6B, 0xC9, 0xDE, 0x6A, 0x7D, 0x32, 0x56, 0x14, 0x12, 0x6A, 0x9C, 0xD6, 0xE0, 0xB6, 0x8E, 0xD0, 0xE9, 0x6F, 0x75, 0x11, 0x11, 0xF6, 0xE2, 0xBA, 0x16, 0x1D, 0xD8, 0x93, 0x8B, 0x94, 0x23, 0xE6, 0xEA, 0x34, 0x62, 0x4B, 0xD8, 0xAC, 0x3F, 0x47, 0x1C, 0xD1, 0x87, 0x7F, 0x1C, 0x9E, 0x74, 0x7D, 0xA5, 0x89, 0x1E, 0x23, 0x76, 0x4E, 0x6C, 0xE4, 0x13, 0x55, 0xE6, 0xAB, 0x2A, 0x7A, 0x03, 0x85, 0xC4, 0x02, 0x2F, 0x73, 0xF1, 0x42, 0xA2, 0xCC, 0x77, 0x90, 0x47, 0x98, 0xE3, 0xD6, 0xA4, 0x78, 0x42, 0x0C, 0x4F, 0x8F, 0x30, 0xC7, 0xCD, 0xA2, 0x78, 0x84, 0x56, 0x28, 0x47, 0xA8, 0xB5, 0x47, 0x4D, 0x42, 0x74, 0x96, 0x8A, 0x7F, 0x84, 0x5F, 0xED, 0x93, 0x2D, 0x4D, 0x58, 0x22, 0xEB, 0x72, 0x42, 0x70, 0xA8, 0xF8, 0xC0, 0x51, 0x2C, 0xF6, 0x89, 0xFE, 0xE2, 0x16, 0x6A, 0xAD, 0x8C, 0xB0, 0x2F, 0x8F, 0xC8, 0xA8, 0x2F, 0x04, 0x96, 0x19, 0xD5, 0x6B, 0x50, 0x97, 0x96, 0xC2, 0x16, 0x36, 0x1B, 0x77, 0x24, 0x42, 0x73, 0x8E, 0x18, 0x72, 0xB2, 0xB8, 0x43, 0x93, 0x6B, 0xD8, 0x62, 0x9E, 0xEE, 0x77, 0x2D, 0x54, 0x99, 0x29, 0xE5, 0x34, 0x5A, 0x22, 0x7C, 0x6E, 0xCC, 0x15, 0xDB, 0xBC, 0x70, 0xBE, 0xD4, 0x45, 0xD5, 0x19, 0x70, 0x5F, 0xB7, 0x01, 0xDF, 0xBE, 0x6D, 0xE1, 0x0B, 0xAF, 0x6C, 0x94, 0xF2, 0x13, 0x8E, 0x46, 0xF8, 0x0C, 0x8C, 0xD8, 0x54, 0xFA, 0x45, 0x6D, 0xF7, 0x17, 0xF6, 0x47, 0xE8, 0x98, 0x68, 0xA1, 0x5E, 0x97, 0x57, 0x36, 0x48, 0x39, 0x83, 0x36, 0x4B, 0x3C, 0x73, 0xA9, 0xE8, 0x06, 0x26, 0x5D, 0xD8, 0x33, 0x37, 0x5C, 0x40, 0x7A, 0xA2, 0x85, 0x7A, 0x5D, 0x5E, 0x5A, 0x2F, 0xE5, 0x2C, 0x18, 0xB7, 0x26, 0x2A, 0x8D, 0x1D, 0xBA, 0xF1, 0x4B, 0x84, 0xEF, 0xF3, 0x5A, 0xBC, 0xB0, 0xCE, 0xC7, 0x68, 0xB7, 0x2A, 0xA6, 0x1A, 0xD5, 0x9E, 0xE8, 0x74, 0xDC, 0xA8, 0x9B, 0xFA, 0xDD, 0xB1, 0x40, 0xBD, 0x2E, 0x83, 0xBA, 0x8D, 0x59, 0x3E, 0x65, 0x3C, 0x22, 0xC2, 0x4E, 0x19, 0x63, 0x7E, 0x37, 0xFB, 0xED, 0x7F, 0x44, 0x33, 0xDA, 0x35, 0x4D, 0x2B, 0x1E, 0x11, 0x61, 0x86, 0x45, 0xB9, 0xAF, 0xA0, 0x5F, 0xAF, 0x8C, 0xD7, 0xE6, 0x4E, 0x3B, 0x5E, 0x80, 0x35, 0x3A, 0xA7, 0xDD, 0x8E, 0xFF, 0x18, 0xFF, 0x1F, 0xE6, 0x5F, 0x1F, 0xA9, 0x98, 0xCC, 0x0D, 0x77, 0xF1, 0x32, 0x00, 0x00, 0x00, 0x25, 0x74, 0x45, 0x58, 0x74, 0x64, 0x61, 0x74, 0x65, 0x3A, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x00, 0x32, 0x30, 0x31, 0x37, 0x2D, 0x30, 0x35, 0x2D, 0x32, 0x39, 0x54, 0x32, 0x31, 0x3A, 0x35, 0x38, 0x3A, 0x30, 0x37, 0x2B, 0x30, 0x32, 0x3A, 0x30, 0x30, 0x19, 0xBB, 0x75, 0xB7, 0x00, 0x00, 0x00, 0x25, 0x74, 0x45, 0x58, 0x74, 0x64, 0x61, 0x74, 0x65, 0x3A, 0x6D, 0x6F, 0x64, 0x69, 0x66, 0x79, 0x00, 0x32, 0x30, 0x31, 0x37, 0x2D, 0x30, 0x35, 0x2D, 0x32, 0x39, 0x54, 0x32, 0x31, 0x3A, 0x35, 0x38, 0x3A, 0x30, 0x37, 0x2B, 0x30, 0x32, 0x3A, 0x30, 0x30, 0x68, 0xE6, 0xCD, 0x0B, 0x00, 0x00, 0x00, 0x19, 0x74, 0x45, 0x58, 0x74, 0x53, 0x6F, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x00, 0x77, 0x77, 0x77, 0x2E, 0x69, 0x6E, 0x6B, 0x73, 0x63, 0x61, 0x70, 0x65, 0x2E, 0x6F, 0x72, 0x67, 0x9B, 0xEE, 0x3C, 0x1A, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4E, 0x44, 0xAE, 0x42, 0x60, 0x82 };
}
};
#endif
Don't call
png_set_sig_bytes(png_ctx, PNG_SIG_BYTES);
This signals libpng to skip reading the signature bytes causing your offset to be wrong when you start reading the png data. Offset points to zero and libpng assumes that it's already 8 (or more accurately that there is no signature in the stream).
Source: I ran this through a debugger.
I'm trying to read a LAS File 1.3 Header from a file.
In every single header that I've seen, The first thing i expect to read is the Format Signature which is always "LASF".
When i try and read the file, All I'm seeing is 'ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ'
I know the header size is 227, I tried to even just read a length of 227 straight from the file but i still don't read what I'm supposed to. I hope this makes sense.
this is what i've tried:
typedef struct Header
{
char File_Signature[4];
USHORT SourceID;
USHORT Reserved1;
UINT GUID1;
USHORT GUID2;
USHORT GUID3;
char GUID4[8];
BYTE VersionMajor;
BYTE VersionMinor;
char SystemID[32];
char GeneratingSoftware[32];
USHORT DOY;
USHORT YEAR;
USHORT HeaderSize;
UINT PointOffset;
INT NumberOfVariableLengthRecords;
BYTE PointDataFormatID;
USHORT PointDataRecordLength;
INT NumberOfPointRecords;
UINT NumberofPointsByReturn1;
UINT NumberofPointsByReturn2;
UINT NumberofPointsByReturn3;
UINT NumberofPointsByReturn4;
UINT NumberofPointsByReturn5;
double XScaleFactor;
double YScaleFactor;
double ZScaleFactor;
double Xoffset;
double Yoffset;
double Zoffset;
double MaxX;
double MinX;
double MaxY;
double MinY;
double MaxZ;
double MinZ;
} LasHeader;
void OpenLasFile()
{
//THIS DOES NOT WORK
char buffer[227];
ifstream myFile ("C:\atlass\area_cov.las");
myFile.read (buffer, 227);
//NOT WORK, TRIED THIS TOO
ifstream input_file("C:\atlass\area_cov.las", ios::binary);
LasHeader header;
input_file.read((char*)&header, sizeof(header));
input_file.close();
//ALL DATA OUTPUT'ed ARE 'ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ'
}
This is a block of binary from the file I'm trying to read.
4C4153460000000001000000020003003132333435363738010241746C6173732041746C6173436F72652020202020202020202020202020202041746C6173436F726520202020202020202020202020202020202020202020201E01DC07E300E300000000000000011C0014012F0014012F0000000000000000000000000000000000FCA9F1D24D62503FFCA9F1D24D62503FFCA9F1D24D62503F00000000B05320410000000024FF53410000000000000000E7B3FA8388A920411B5611E9BC1B20417710D27C2711544114A5EC807EF45341C520B072685D684037894160E5D012C021BE92FF06661701A9600000D803C902E2000100AC7136BDE325044137
My question is: Why am i Reading garbage values, what have i done wrong?
-------------------- UPDATE --------------------------
I tested this and it worked, So it must be a problem reading the file, can anyone help?
what worked was:
unsigned char rawData[552] =
{
0x4C, 0x41, 0x53, 0x46, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x03, 0x00,
0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x01, 0x02, 0x41, 0x74, 0x6C, 0x61, 0x73, 0x73,
0x20, 0x41, 0x74, 0x6C, 0x61, 0x73, 0x43, 0x6F, 0x72, 0x65, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x41, 0x74, 0x6C, 0x61, 0x73, 0x43,
0x6F, 0x72, 0x65, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x1E, 0x01, 0xDC, 0x07, 0xE3, 0x00,
0xE3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x1C, 0x00, 0x14, 0x01, 0x2F, 0x00, 0x14,
0x01, 0x2F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0xFC, 0xA9, 0xF1, 0xD2, 0x4D, 0x62, 0x50, 0x3F, 0xFC, 0xA9, 0xF1, 0xD2, 0x4D,
0x62, 0x50, 0x3F, 0xFC, 0xA9, 0xF1, 0xD2, 0x4D, 0x62, 0x50, 0x3F, 0x00, 0x00, 0x00, 0x00, 0xB0,
0x53, 0x20, 0x41, 0x00, 0x00, 0x00, 0x00, 0x24, 0xFF, 0x53, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0xE7, 0xB3, 0xFA, 0x83, 0x88, 0xA9, 0x20, 0x41, 0x1B, 0x56, 0x11, 0xE9, 0xBC,
0x1B, 0x20, 0x41, 0x77, 0x10, 0xD2, 0x7C, 0x27, 0x11, 0x54, 0x41, 0x14, 0xA5, 0xEC, 0x80, 0x7E,
0xF4, 0x53, 0x41, 0xC5, 0x20, 0xB0, 0x72, 0x68, 0x5D, 0x68, 0x40, 0x37, 0x89, 0x41, 0x60, 0xE5,
0xD0, 0x12, 0xC0, 0x21, 0xBE, 0x92, 0xFF, 0x06, 0x66, 0x17, 0x01, 0xA9, 0x60, 0x00, 0x00, 0xD8,
0x03, 0xC9, 0x02, 0xE2, 0x00, 0x01, 0x00, 0xAC, 0x71, 0x36, 0xBD, 0xE3, 0x25, 0x04, 0x41, 0x37,
0xB9, 0x92, 0xFF, 0x77, 0x58, 0x17, 0x01, 0xD7, 0x60, 0x00, 0x00, 0xE2, 0x0A, 0xC9, 0x02, 0xE2,
0x00, 0x01, 0x00, 0x4B, 0x90, 0x11, 0x90, 0xE3, 0x25, 0x04, 0x41, 0x00, 0xBF, 0x92, 0xFF, 0x98,
0x3A, 0x17, 0x01, 0x2B, 0x62, 0x00, 0x00, 0x23, 0x0A, 0x49, 0x02, 0xE4, 0x00, 0x01, 0x00, 0xBF,
0xF5, 0x61, 0xBD, 0xE3, 0x25, 0x04, 0x41, 0x1A, 0xBD, 0x92, 0xFF, 0x30, 0x11, 0x17, 0x01, 0xE4,
0x62, 0x00, 0x00, 0xDF, 0x08, 0x49, 0x02, 0xE4, 0x00, 0x01, 0x00, 0xF8, 0x6E, 0xF3, 0xA6, 0xE3,
0x25, 0x04, 0x41, 0x01, 0xBE, 0x92, 0xFF, 0x67, 0xE7, 0x16, 0x01, 0x83, 0x63, 0x00, 0x00, 0xCB,
0x06, 0x49, 0x02, 0xE5, 0x00, 0x01, 0x00, 0x0B, 0xF3, 0x1E, 0xA7, 0xE3, 0x25, 0x04, 0x41, 0xF2,
0xBB, 0x92, 0xFF, 0x99, 0xD9, 0x16, 0x01, 0x6D, 0x63, 0x00, 0x00, 0x03, 0x09, 0x49, 0x02, 0xE5,
0x00, 0x01, 0x00, 0x82, 0x1C, 0x94, 0x90, 0xE3, 0x25, 0x04, 0x41, 0xFA, 0xBE, 0x92, 0xFF, 0x98,
0xBE, 0x16, 0x01, 0x13, 0x63, 0x00, 0x00, 0xFF, 0x08, 0x49, 0x02, 0xE5, 0x00, 0x01, 0x00, 0xE5,
0xF0, 0x49, 0xA7, 0xE3, 0x25, 0x04, 0x41, 0xEE, 0xBC, 0x92, 0xFF, 0xDE, 0xB0, 0x16, 0x01, 0x04,
0x63, 0x00, 0x00, 0x8E, 0x0B, 0x49, 0x02, 0xE5, 0x00, 0x01, 0x00, 0x95, 0xA0, 0xBF, 0x90, 0xE3,
0x25, 0x04, 0x41, 0xD2, 0xBD, 0x92, 0xFF, 0x19, 0x88, 0x16, 0x01, 0xA9, 0x63, 0x00, 0x00, 0xD1,
0x08, 0x49, 0x02, 0xE7, 0x00, 0x01, 0x00, 0xA7, 0x24, 0xEB, 0x90, 0xE3, 0x25, 0x04, 0x41, 0xA8,
0xBE, 0x92, 0xFF, 0x29, 0x64, 0x16, 0x01, 0x97, 0x63, 0x00, 0x00, 0xFD, 0x04, 0x49, 0x02, 0xE7,
0x00, 0x01, 0x00, 0xC4, 0xF0, 0x11, 0x91, 0xE3, 0x25, 0x04, 0x41, 0x79, 0xD0, 0x92, 0xFF, 0xD0,
0x70, 0x17, 0x01, 0x30, 0x61, 0x00, 0x00, 0x60, 0x02, 0xC9, 0x02, 0xE2, 0x00, 0x01, 0x00, 0x91,
0x65, 0xC1, 0x44, 0xE4, 0x25, 0x04, 0x41, 0x12, 0xC7, 0x92, 0xFF, 0x02, 0x5E, 0x17, 0x01, 0x79,
0x61, 0x00, 0x00, 0x79, 0x05, 0xC9, 0x02, 0xE2,
} ;
LasHeader test;
memcpy(&test, rawData, sizeof(test));
The issue is here:
ifstream myFile ("C:\atlass\area_cov.las");
Backslash is a special character in C strings that forms escape sequences. In this particular case, \a is replaced by a bell character (0x0B), so it is trying to open the wrong path and failing.
Instead, you need to escape all the backslashes that occur in the path by doubling them:
ifstream myFile ("C:\\atlass\\area_cov.las");
This is another one of those "I have a blank screen, please help me fix it" moments.
This example is from The OpenGL Programming Guide, Version 2.1, Page 311-312.
The example is supposed to draw 2 lines of text on the screen.
Past of the problem I think is that I don't understand how glRasterPos2i() works. Does it:
A:) Set the position of bitmaps to be drawn in the 3D world in homogeneous / "OpenGL coordinates"
B:) Set the position of bitmaps to be drawn on the screen in pixel coordinates
Here is the code I have so far: You can pretty much ignore the first big lump which defines what the bitmaps are.
#include <GL/glut.h>
#include <cstdlib>
#include <iostream>
#include <cstring>
// This first bit is kind of irreverent, it sets up some fonts in memory as bitmaps
GLubyte space[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
GLubyte letters[][13] = {
{ 0x00, 0x00, 0xc3, 0xc3, 0xc3, 0xc3, 0xff, 0xc3, 0xc3, 0xc3, 0x66, 0xc3, 0x18 },
{ 0x00, 0x00, 0xfe, 0xc7, 0xc3, 0xc3, 0xc7, 0xfe, 0xc7, 0xc3, 0xc3, 0xc7, 0xfe },
{ 0x00, 0x00, 0x7e, 0xe7, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xe7, 0x7e },
{ 0x00, 0x00, 0xfc, 0xce, 0xc7, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc7, 0xce, 0xfc },
{ 0x00, 0x00, 0xff, 0xc0, 0xc0, 0xc0, 0xc0, 0xfc, 0xc0, 0xc0, 0xc0, 0xc0, 0xff },
{ 0x00, 0x00, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xfc, 0xc0, 0xc0, 0xc0, 0xff },
{ 0x00, 0x00, 0x7e, 0xe7, 0xc3, 0xc3, 0xcf, 0xc0, 0xc0, 0xc0, 0xc0, 0xe7, 0x7e },
{ 0x00, 0x00, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xff, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3 },
{ 0x00, 0x00, 0x7e, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x7e },
{ 0x00, 0x00, 0x7c, 0xee, 0xc6, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06 },
{ 0x00, 0x00, 0xc3, 0xc6, 0xcc, 0xd8, 0xf0, 0xe0, 0xf0, 0xd8, 0xcc, 0xc6, 0xc3 },
{ 0x00, 0x00, 0xff, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0 },
{ 0x00, 0x00, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xdb, 0xff, 0xff, 0xe7, 0xc3 },
{ 0x00, 0x00, 0xc7, 0xc7, 0xcf, 0xcf, 0xdf, 0xdb, 0xfb, 0xf3, 0xf3, 0xe3, 0xe3 },
{ 0x7e, 0xe7, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xe7, 0x7e },
{ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xfe, 0xc0, 0xf3, 0xc7, 0xc3, 0xc3, 0xc7, 0xfe },
{ 0x00, 0x00, 0x3f, 0x6e, 0xdf, 0xdb, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0x66, 0x3c },
{ 0x00, 0x00, 0xc3, 0xc6, 0xcc, 0xd8, 0xf0, 0xfe, 0xc7, 0xc3, 0xc3, 0xc7, 0xfe },
{ 0x00, 0x00, 0x7e, 0xe7, 0x03, 0x03, 0x07, 0x7e, 0xe0, 0xc0, 0xc0, 0xe7, 0x7e },
{ 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xff },
{ 0x00, 0x00, 0x7e, 0xe7, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3 },
{ 0x00, 0x00, 0x18, 0x3c, 0x3c, 0x66, 0x66, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3 },
{ 0x00, 0x00, 0xc3, 0xe7, 0xff, 0xff, 0xdb, 0xdb, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3 },
{ 0x00, 0x00, 0xc3, 0x66, 0x66, 0xc3, 0xc3, 0x18, 0xc3, 0xc3, 0x66, 0x66, 0xc3 },
{ 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xc3, 0xc3, 0x66, 0x66, 0xc3 },
{ 0x00, 0x00, 0xff, 0xc0, 0xc0, 0x60, 0x30, 0x7e, 0x0c, 0x06, 0x03, 0x03, 0xff }
};
// This is just copying from the book
GLuint fontOffset;
void makeRasterFont()
{
GLuint i, j;
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
fontOffset = glGenLists(128);
for(i = 0, j = 'A'; i < 26; i ++, j ++)
{
glNewList(fontOffset + ' ', GL_COMPILE);
glBitmap(8, 13, 0.0, 2.0, 10.0, 0.0, letters[i]);
glEndList();
}
glNewList(fontOffset + ' ', GL_COMPILE);
glBitmap(8, 13, 0.0, 2.0, 10.0, 0.0, space);
glEndList();
}
void init()
{
glShadeModel(GL_FLAT);
makeRasterFont();
}
void printString(char* s)
{
glPushAttrib(GL_LIST_BIT);
glListBase(fontOffset);
glCallLists(std::strlen(s), GL_UNSIGNED_BYTE, (GLubyte*)s);
glPopAttrib();
}
void display()
{
GLfloat white[3] = {1.0, 1.0, 1.0 };
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glColor3fv(white);
// Print some text on the screen at (20,60) and (20,40)
glRasterPos2i(20, 60);
printString("THE QUICK BROWN FOX JUMPS");
glRasterPos2i(20, 40);
printString("OVER A LAZY DOG");
glFlush();
}
void reshape(int w, int h)
{
// Set the viewport
glViewport(0, 0, (GLsizei)w, (GLsizei)h);
// Set viewing mode
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.0, (GLfloat)w / (GLfloat)h, 0.01, 100.0);
glMatrixMode(GL_MODELVIEW);
}
int main(int argc, char** argv)
{
/* Init glut with a single buffer display mode,
* window size, position and title */
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);
glutInitWindowSize(500, 500);
glutInitWindowPosition(100, 100);
glutCreateWindow(argv[0]);
// Call init routine to set OpenGL specific initialization values
init();
// Set callback function
glutDisplayFunc(display);
glutReshapeFunc(reshape);
// Enter main loop
glutMainLoop();
return EXIT_SUCCESS;
}
Sorry for the type of question - I hate just asking "please fix my code", because really I should be able to fix it myself. On this occasion I find myself, stuck, basically. Thanks for you time and help.
Solution:
For those interested, to "get it to work", the changes made were:
1: Change gluPerspective to gluOrtho2D(0, width, 0, height).
2: Change glnewList(fontOffset + ' ', GL_COMPILE) to glnewList(fontOffset + j, GL_COMPILE) - not BOTH, just the FIRST ONE IN THE LOOP.
3: Set the glRasterPos2i to be anywhere within the region specified by glOrtho2D. My width and height are both 500, so I used coordinates (20, 60) and then (20, 40).
You could have just left it with gluPerspective, and used coordinates about (0,0) without specifying any transformations. However, since a bitmap is 2D I think this is less intuitive.
As to your rendering problem, hint, you don't use j...
In the for loop:
glNewList(fontOffset + ' ', GL_COMPILE);
replace your space with the letter you want.
The glRasterPos function specifies the raster position in object coordinates. Those are passed through the current modelview and projection matrices (at the time of the glRasterPos-call) to get the actual raster position in window (viewport) coordinates to be used for things like glDrawPixels and glBitmap (thus option A). So given your current perspective projection and identity modelview, those (20,40) (which are probably meant as pixels) are quite off the screen. If you want to specify it in pixels (which is usually the case), you need to setup your transformation pipeline accordingly.
But I wouldn't recommend using those old and deprecated (and likely slooow) pixel drawing functions at all (and neither to learn from the unfortunately awfully outdated Redbook). Just draw a textured quad with a custom shader that just takes window coordinates.
i made a socket that accepting connection from a game , in the game u should type in username and password , i can recive it bt , it's like ummmm encrypted letteers and numbers(”VeDbç)
3¥ثuo_‰°"“Fِمض)
my question is where to look at so i can understand how to deal with this prob , is there a tut. or hint or somthing that i can work on so i can reach what am looking for!?
thanks.
unsigned char* Key3;
unsigned char* Key4;
unsigned char Low;
unsigned char High;
const unsigned char Key1[] =
{
0x9D, 0x90, 0x83, 0x8A, 0xD1, 0x8C, 0xE7, 0xF6, 0x25, 0x28, 0xEB, 0x82, 0x99, 0x64, 0x8F, 0x2E,
0x2D, 0x40, 0xD3, 0xFA, 0xE1, 0xBC, 0xB7, 0xE6, 0xB5, 0xD8, 0x3B, 0xF2, 0xA9, 0x94, 0x5F, 0x1E,
0xBD, 0xF0, 0x23, 0x6A, 0xF1, 0xEC, 0x87, 0xD6, 0x45, 0x88, 0x8B, 0x62, 0xB9, 0xC4, 0x2F, 0x0E,
0x4D, 0xA0, 0x73, 0xDA, 0x01, 0x1C, 0x57, 0xC6, 0xD5, 0x38, 0xDB, 0xD2, 0xC9, 0xF4, 0xFF, 0xFE,
0xDD, 0x50, 0xC3, 0x4A, 0x11, 0x4C, 0x27, 0xB6, 0x65, 0xE8, 0x2B, 0x42, 0xD9, 0x24, 0xCF, 0xEE,
0x6D, 0x00, 0x13, 0xBA, 0x21, 0x7C, 0xF7, 0xA6, 0xF5, 0x98, 0x7B, 0xB2, 0xE9, 0x54, 0x9F, 0xDE,
0xFD, 0xB0, 0x63, 0x2A, 0x31, 0xAC, 0xC7, 0x96, 0x85, 0x48, 0xCB, 0x22, 0xF9, 0x84, 0x6F, 0xCE,
0x8D, 0x60, 0xB3, 0x9A, 0x41, 0xDC, 0x97, 0x86, 0x15, 0xF8, 0x1B, 0x92, 0x09, 0xB4, 0x3F, 0xBE,
0x1D, 0x10, 0x03, 0x0A, 0x51, 0x0C, 0x67, 0x76, 0xA5, 0xA8, 0x6B, 0x02, 0x19, 0xE4, 0x0F, 0xAE,
0xAD, 0xC0, 0x53, 0x7A, 0x61, 0x3C, 0x37, 0x66, 0x35, 0x58, 0xBB, 0x72, 0x29, 0x14, 0xDF, 0x9E,
0x3D, 0x70, 0xA3, 0xEA, 0x71, 0x6C, 0x07, 0x56, 0xC5, 0x08, 0x0B, 0xE2, 0x39, 0x44, 0xAF, 0x8E,
0xCD, 0x20, 0xF3, 0x5A, 0x81, 0x9C, 0xD7, 0x46, 0x55, 0xB8, 0x5B, 0x52, 0x49, 0x74, 0x7F, 0x7E,
0x5D, 0xD0, 0x43, 0xCA, 0x91, 0xCC, 0xA7, 0x36, 0xE5, 0x68, 0xAB, 0xC2, 0x59, 0xA4, 0x4F, 0x6E,
0xED, 0x80, 0x93, 0x3A, 0xA1, 0xFC, 0x77, 0x26, 0x75, 0x18, 0xFB, 0x32, 0x69, 0xD4, 0x1F, 0x5E,
0x7D, 0x30, 0xE3, 0xAA, 0xB1, 0x2C, 0x47, 0x16, 0x05, 0xC8, 0x4B, 0xA2, 0x79, 0x04, 0xEF, 0x4E,
0x0D, 0xE0, 0x33, 0x1A, 0xC1, 0x5C, 0x17, 0x06, 0x95, 0x78, 0x9B, 0x12, 0x89, 0x34, 0xBF, 0x3E
};
const unsigned char Key2[] =
{
0x62, 0x4F, 0xE8, 0x15, 0xDE, 0xEB, 0x04, 0x91, 0x1A, 0xC7, 0xE0, 0x4D, 0x16, 0xE3, 0x7C, 0x49,
0xD2, 0x3F, 0xD8, 0x85, 0x4E, 0xDB, 0xF4, 0x01, 0x8A, 0xB7, 0xD0, 0xBD, 0x86, 0xD3, 0x6C, 0xB9,
0x42, 0x2F, 0xC8, 0xF5, 0xBE, 0xCB, 0xE4, 0x71, 0xFA, 0xA7, 0xC0, 0x2D, 0xF6, 0xC3, 0x5C, 0x29,
0xB2, 0x1F, 0xB8, 0x65, 0x2E, 0xBB, 0xD4, 0xE1, 0x6A, 0x97, 0xB0, 0x9D, 0x66, 0xB3, 0x4C, 0x99,
0x22, 0x0F, 0xA8, 0xD5, 0x9E, 0xAB, 0xC4, 0x51, 0xDA, 0x87, 0xA0, 0x0D, 0xD6, 0xA3, 0x3C, 0x09,
0x92, 0xFF, 0x98, 0x45, 0x0E, 0x9B, 0xB4, 0xC1, 0x4A, 0x77, 0x90, 0x7D, 0x46, 0x93, 0x2C, 0x79,
0x02, 0xEF, 0x88, 0xB5, 0x7E, 0x8B, 0xA4, 0x31, 0xBA, 0x67, 0x80, 0xED, 0xB6, 0x83, 0x1C, 0xE9,
0x72, 0xDF, 0x78, 0x25, 0xEE, 0x7B, 0x94, 0xA1, 0x2A, 0x57, 0x70, 0x5D, 0x26, 0x73, 0x0C, 0x59,
0xE2, 0xCF, 0x68, 0x95, 0x5E, 0x6B, 0x84, 0x11, 0x9A, 0x47, 0x60, 0xCD, 0x96, 0x63, 0xFC, 0xC9,
0x52, 0xBF, 0x58, 0x05, 0xCE, 0x5B, 0x74, 0x81, 0x0A, 0x37, 0x50, 0x3D, 0x06, 0x53, 0xEC, 0x39,
0xC2, 0xAF, 0x48, 0x75, 0x3E, 0x4B, 0x64, 0xF1, 0x7A, 0x27, 0x40, 0xAD, 0x76, 0x43, 0xDC, 0xA9,
0x32, 0x9F, 0x38, 0xE5, 0xAE, 0x3B, 0x54, 0x61, 0xEA, 0x17, 0x30, 0x1D, 0xE6, 0x33, 0xCC, 0x19,
0xA2, 0x8F, 0x28, 0x55, 0x1E, 0x2B, 0x44, 0xD1, 0x5A, 0x07, 0x20, 0x8D, 0x56, 0x23, 0xBC, 0x89,
0x12, 0x7F, 0x18, 0xC5, 0x8E, 0x1B, 0x34, 0x41, 0xCA, 0xF7, 0x10, 0xFD, 0xC6, 0x13, 0xAC, 0xF9,
0x82, 0x6F, 0x08, 0x35, 0xFE, 0x0B, 0x24, 0xB1, 0x3A, 0xE7, 0x00, 0x6D, 0x36, 0x03, 0x9C, 0x69,
0xF2, 0x5F, 0xF8, 0xA5, 0x6E, 0xFB, 0x14, 0x21, 0xAA, 0xD7, 0xF0, 0xDD, 0xA6, 0xF3, 0x8C, 0xD9
};
// Decrypt Function
void CAuthCryptography::Decrypt(void* in, void* out, int Length)
{
unsigned char* pIn = (unsigned char*)in;
unsigned char* pOut = (unsigned char*)out;
for (int i = 0; i < Length; i++)
{
pOut[i] = (unsigned char)(pIn[i] ^ 0xAB);
pOut[i] = (unsigned char)((pOut[i] << 4) | (pOut[i] >> 4));
if (UsingAlternate)
{
pOut[i] = (unsigned char)(Key4[In.High] ^ pOut[i]);
pOut[i] = (unsigned char)(Key3[In.Low] ^ pOut[i]);
}
else
{
pOut[i] = (unsigned char)(Key2[In.High] ^ pOut[i]);
pOut[i] = (unsigned char)(Key1[In.Low] ^ pOut[i]);
}
In.Counter++;
}
}
i got this code and it's working but can someone explain to me how it's working becuase i dont understand it?!
or if there is a tut. i can read or something
I suggest you use something like WireShark, tcpdump etc to view the TCP stream, just to make sure you haven't bodged up your tcp data-reading code. More generally, if you are getting data like that, then only the sending side will know why, and you either ask them or look at how that data is handled by some other receiving program they've made (i.e. debug another client, find out what it does with that mess).
When it really is encrypted, your chances are low.
But chances are it's just UTF-7 or UTF-8 encoded, not encrypted.
And if it is SSL on a non-standard port, use oSpy.