asn1c - przypisywanie wartości do parametrów

0

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

0

musisz zrobić coś takiego
OCTET_STRING_t.size = 6;
OCTET_STRING_t.buff = malloc(OCTET_STRING_t.size);
unsigned char byte[6] = { 0x11, 0xfa, 0xbb, 0xba, 0x00, 0x3f };
memcpy(OCTET_STRING_t.buff, byte, OCTET_STRING_t.size);

i potem zawsze musisz pamiętać o zwolnieniu przydzielonej pamięci, gdy nie jest już potrzebna, czyli
free(OCTET_STRING_t.buff)

pozdro

0

Przepraszam że tak późno odpisuje, ale nie miałem wcześniej czasu tego sprawdzić.

Dzięki wielkie za wskazówki, po drobnych modyfikacjach pomogło :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1