Witam serdecznie,
Jako że na co dzień programuje głównie obiektowo w C# mam spore problemy po przymusowej przesiadce na język C.
Przejdę jednak do rzeczy:
Korzystając z kompilatora asn1c (Strona domowa: http://lionet.info/asn1c/blog/) kompiluje plik module.asn1 o poniższej zawartości:
myModule DEFINITIONS ::=
BEGIN
PI-DSS-Message ::= SEQUENCE {
rl INTEGER(0..255),
data INTEGER(0..255),
pid OCTET STRING (SIZE(6))
}
END
Bazując na dokumentacji oraz przykładach ze strony stworzyłem plik main.c :
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <PI-DSS-Message.h>
static int write_out(const void *buffer, size_t size, void *app_key) {
FILE *out_fp = app_key;
size_t wrote = fwrite(buffer, 1, size, out_fp);
return (wrote == size) ? 0 : -1;
}
int main(int ac, char **av) {
PI_DSS_Message_t *message;
asn_enc_rval_t ec;
const char *filename;
printf("Size of Message: %lu \n", sizeof(PI_DSS_Message_t));
message = calloc(1, sizeof(PI_DSS_Message_t));
if(!message)
{
perror("calloc() failed");
exit(1);
}
unsigned char byte[6] = { 0x11, 0xfa, 0xbb, 0xba, 0x00, 0x3f };
printf("MAC: %02x:%02x:%02x:%02x:%02x:%02x \n", byte[0], byte[1], byte[2], byte[3], byte[4], byte[5]);
message->rl = 258;
message->data = 100;
message->pid = ???????;
if(ac < 2)
{
fprintf(stderr, "Specify filename for BER output\n");
}
else
{
filename = av[1];
FILE *fp = fopen(filename, "wb"); // for BER output
if(!fp) {
perror(filename);
exit(1);
}
/* Encode type as BER (DER) */
ec = der_encode(&asn_DEF_PI_DSS_Message, message, write_out, fp);
fclose(fp);
if(ec.encoded == -1) {
fprintf(stderr, "Could not encode Rectangle (at %s)\n",
ec.failed_type ? ec.failed_type->name : "unknown");
exit(1);
} else {
fprintf(stderr, "Created %s with BER encoded PI-DSS-Message\n", filename);
}
}
return 0; /* Encoding finished successfully */
}
Problem z jakim sie borykam polega na przypisaniu wartości do parametru message->pid (typ parametru OCTET_STRING_t) w którym ma być przechowywany adres MAC urządzenia czyli ciąg sześciu oktetów (OCTET STRING). Jak kolwiek bym nie próbował to albo kompilator wyrzuca błędy albo program wysypuje się wraz z komunikatem "Naruszenie ochrony pamięci"
Definicja typu OCTET_STRING_t wygenerowana przez kompilator wygląda następująco:
typedef struct OCTET_STRING {
uint8_t *buf; /* Buffer with consecutive OCTET_STRING bits */
int size; /* Size of the buffer */
asn_struct_ctx_t _asn_ctx; /* Parsing across buffer boundaries */
} OCTET_STRING_t;
Docelowo chciałbym wpisać do parametru message->pid MAC adres zapisany w ten sposób:
unsigned char byte[6] = { 0x11, 0xfa, 0xbb, 0xba, 0x00, 0x3f };
lub ten:
char* mac = "11fabbba003f";
Proszę o wskazówki w jaki sposób mogę te dane wpisać do message->pid
Pozdrawiam
Fabian