Προς το περιεχόμενο

αναγνωση pointer πινακα χαρακτηρων σε ΗΕΧ bytes


nomercy14

Προτεινόμενες αναρτήσεις

Δημοσ.

Καλησπέρα παιδιά, δεν ειμαι νέος στο ινσομνια αλλα ο προηγούμενος μου λογαριασμος για κάποιο λόγο δε λειτουργεί, anyway..

Δουλεύω πάνω σε ενα project στο οποίο η δουλειά μου είναι να διαβάζω ενα image αρχειο (πχ example.img) σε κομματια των 4096 bytes (fragments) σε μορφη ΗΕΧ και byte, οτιδηποτε και αν περιέχει το αρχειο. Χρησιμοποιώ char *buffer; με unsigned long fileLen; για να αποθηκεύω ότι διαβάζω απο το image αρχειο και του οποίου το μέγεθος ορίζετε καθε φορά ως το μέγεθος του αρχείου image που εξετάζω. Η συναρτηση ανάγνωσης απο αρχείο ειναι fread(buffer, fileLen, 1, file);. Ολα καλα ως εδω, διαβάζω ακριβώς οτι περιέχει το αρχείο ακόμα και ειδικούς χαρακτήρες(NUL,SOH,STX,EOT,DLE,BS,FF κλπ κλπ)χωρίς πρόβλημα. Τωρα θέλω να διαβάσω απο τον buffer μου byte per byte 4096 συνολικα bytes που ειναι το ενα fragment μου και να δημιουργησω το άθροισμα τους διαβαζοντας τα byte της ΗΕΧ μορφης(οχι το αθροισμα οτι ειναι 4096 bytes) και εδω ειναι το προβλημα μου, δεν μπορω να διαβάσω απο τον buffer μου τα byte της ΗΕΧ μορφης και να τα προσθέτω. Εχω προσπαθήσει με διάφορες συναρτήσεις αλλα δεν εχω σωστό αποτέλεσμα. Η τελευταία που ποσπάθησα ηταν με την sscanf() αλλα και παλι οχι σωστα αποτελέσματα, ο κωδικας με την sscanf είναι κάπως ετσι :

 

for(i = 0;i < buffer_size;++i){

sscanf(y,"%x",((char *)buffer));

int(y);

sum+=y;

}

avg=sum/buffer_size;

printf("sum = %d\n", sum);

printf("avg = %d\n", avg);

 

οπως είπα εδω είναι που έχω κολλήσει, στο πως θα διαβάσω απο τον buffer μου τα byte της ΗΕΧ μορφής..οποιαδήποτε ιδέα και αν έχετε θα ήταν πολύ χρήσιμη για μένα!

Σας Ευχαριστώ εκ των προτέρων!

Δημοσ.

Για αρχή η μεταβλητή sum οφείλει να δηλωθεί ως τύπος που θα μπορούσε να χωρέσει το άθροισμα που μπορεί να προκύψει, ύστερα το char* δεν μας εξυπηρετεί καθώς είναι signed οπότε τιμές μετά από το 127 γυρίζουν σε αρνητικό συνεπώς τα αποτελέσματα της sum καταστρέφονται (ο τύπος Byte στην C ορίζεται ως unsigned char).

 

Για παράδειγμα:

>
// Sum buffer bytes, xdir.
#include <stdio.h>
#include <stdlib.h>

#define BSIZ 512

int main(void)
{
unsigned char Buff[bSIZ];
unsigned long Sum = 0;

for(int R = 0; R < BSIZ; R++)
{
	Sum += (Buff[R] = rand() % 256);
	if(!(R % 16))
		putchar('\n');
	printf("%.2X ", Buff[R]);
}

printf("\n\nSum = %ld\nAvg = %ld\n", Sum, Sum / BSIZ);

getchar();
return 0;
}

 

ΕΞΟΔΟΣ:

>
82 E6 42 88 CD BB 0F A4 96 2C DE F3 5F 3C 50 24
61 BF D7 EF D1 16 A1 EE 75 2C CB BB 68 B1 C3 4B
29 96 FE 8B EB C9 DC 39 18 32 D8 04 27 EE F4 E7
9F CB 64 C3 6C 04 7A 3B 62 3E D1 D5 0F C2 BD 4E
C6 FD F3 3E E9 35 75 ED 76 8D C1 74 D4 3C 3A 18
E0 0A D6 E3 33 0C 0A 84 B7 A0 F3 69 69 AB C5 1B
70 12 79 D9 5F 77 B3 78 C7 35 F1 7A 01 9E FA 6E
3A 74 86 87 BF A6 2A 80 8B 4C 87 AF 0E E4 B4 68
40 CF E8 95 E6 07 6C 93 24 22 C0 4F 44 8C 0C A1
C5 01 CB E8 A8 49 B3 E7 F6 38 E7 E0 96 E5 60 EF
4D 2A 98 A9 16 5C 79 F5 A5 4C 86 2A 36 7E 49 69
9B A8 FC 3D 85 6F 7B 72 12 5D 69 33 97 26 A2 67
B0 1C E1 4D 86 EF B3 56 61 AA 9B 43 6E EB 87 7F
D1 63 73 BF EE 8E 5C D8 F5 B3 67 E0 AC 1E 52 89
81 9D 1C BA CF 38 F0 6E 70 36 58 D2 85 4D 9F 9A
82 28 87 A4 7C 1F 2C D1 B7 32 38 20 6B 46 49 0B
D7 A4 9F 26 89 AF 0A F6 EB E6 13 10 12 1A 6A 73
C3 F0 90 27 C7 99 C5 16 71 D1 34 29 6D 16 5D A7
CA 2B C3 CC 4B CC D8 A6 EA B3 25 34 AE CB BE C1
AF B3 E5 7D 66 76 FE 5D 3A 89 B3 36 49 06 68 15
74 28 E1 E1 AD 07 32 34 85 94 E7 76 F0 D7 75 3C
5C 68 E0 E0 F2 2D AE 60 2B 52 0D 7C 97 8E 40 0C
EA 94 4F 9F 48 D7 EF 5A D2 83 AF 0F 71 B8 65 9C
E2 09 D8 87 03 35 AF D7 5C 24 9A 35 F1 25 BF 44
47 67 67 3D B4 B5 E9 CF EC 76 D7 36 C9 E4 68 9A
5A 8C 26 AA 30 07 D8 79 E4 F7 B2 98 ED 44 BB 75
A0 98 80 F4 88 19 F7 4B E9 66 B6 23 8F D4 55 ED
DC EA 20 81 11 1B 01 FE DC C2 AD DE 23 63 0E 58
10 21 F1 FA 5D 7B F1 87 E1 4B A3 0F 5C 00 03 4D
7F 1B 1F 45 3F E8 02 1E 5B 7F E3 3D 2C FA 8F A4
AD F8 14 89 CA 52 AF 3A ED 1D F8 31 C7 E0 4C 73
5C 17 7B 2E 52 E8 B3 92 7A 24 AD EF A0 81 16 11

Sum = 67036
Avg = 130

 

Υ.Γ.

Δεν κάνω srand για να διατηρήσω κοινά αποτελέσματα στην rand (διαφέρει βέβαια μεταξύ compilers).

Δημοσ.
. Τωρα θέλω να διαβάσω απο τον buffer μου byte per byte 4096 συνολικα bytes που ειναι το ενα fragment μου και να δημιουργησω το άθροισμα τους διαβαζοντας τα byte της ΗΕΧ μορφης(οχι το αθροισμα οτι ειναι 4096 bytes) και εδω ειναι το προβλημα μου, δεν μπορω να διαβάσω απο τον buffer μου τα byte της ΗΕΧ μορφης και να τα προσθέτω. Εχω προσπαθήσει με διάφορες συναρτήσεις αλλα δεν εχω σωστό αποτέλεσμα. Η τελευταία που ποσπάθησα ηταν με την sscanf() αλλα και παλι οχι σωστα αποτελέσματα, ο κωδικας με την sscanf είναι κάπως ετσι :

 

 

Λογικο, εφοσον ειναι σε binary. Μαλον θελεις να τα προβαλεις ως hex, αυτο θα το κανεις

1) printf με παραμετρο %x (ή %X για caps)

2) με καποια version της itoa (αυτη που εχει 3η παραμετρο με ονομα base εκει βαζεις 16)

3) std::cout<<std::hex<<value

 

Για το sum αυτα που λεει ο παραπανω κυριος.

Δημοσ.

Ευχαριστώ πολύ παιδιά τώρα δουλεύει άψογα! Μου σώσατε το Σαββατοκύριακο :Ρ

Χαιρετίσματα στη πατρίδα απο Αυστρία!

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...