karabouzouk... Δημοσ. 28 Δεκεμβρίου 2009 Δημοσ. 28 Δεκεμβρίου 2009 Δεν βρήκα κάποια έτοιμη συνάρτηση για να το κάνω αυτό και δεν είμαι σίγουρος για το πώς...! Έχει κάποιος καμιά ιδέα..!? Αυτό ακριβώς που θέλω να κάνω είναι από μιά συμβολοσειρά πχ την "ΑΑΑΑΑΑ" να φτιάξω εναν ακέραιο με βάση τον ASCII αριθμό του κάθε γράμματος, τον 656565656565 για το συγκεκριμένο παράδειγμα... Και όπως ανεφέρω και στον τίτλο ο ακαίρεος να είναι τύπου long long.. Ευχαριστώ για όποια βοήθεια ---------- Το μήνυμα προστέθηκε στις 11:57 ---------- Τελικά κάτι έφτιαξα... >#include<stdio.h> #include<math.h> int main(){ int i,d; char a[]="ABCDEFGH"; long long ar=0; printf("%d\n\n",sizeof(a)); d=2*(sizeof(a)-2); for (i=0; i<8; i++){ ar+=(int)a[i]*pow(10,d); d-=2; } printf("%lld\n\n", ar); return 0; } Αν ξέρετε κάποιο καλύτερο ή πιο γρήγορο τρόπο παρακαλώ γράψτε τον εδώ..
kagelos Δημοσ. 28 Δεκεμβρίου 2009 Δημοσ. 28 Δεκεμβρίου 2009 >[color="#0000ff"]#include[/color] <iostream> [color="#0000ff"]#include[/color] <string.h> [color="#0000ff"][b]using[/b][/color] [color="#0000ff"][b]namespace[/b][/color] std; [color="#8000ff"]int[/color] main() { [color="#8000ff"]char[/color] a[] = [color="#a31515"]"zzBBCCDD"[/color]; [color="#8000ff"]int[/color] len = strlen(a); [color="#8000ff"]long[/color] [color="#8000ff"]long[/color] number = [color="#ff8000"]0[/color]; [color="#0000ff"][b]for[/b][/color] ([color="#8000ff"]int[/color] i=[color="#ff8000"]0[/color]; i<len; i++) { [color="#0000ff"][b]if[/b][/color] (a[i] < [color="#ff8000"]100[/color]) number *= [color="#ff8000"]100[/color]; [color="#0000ff"][b]else[/b][/color] number *= [color="#ff8000"]1000[/color]; number += a[i]; } cout << number << endl; system([color="#a31515"]"pause"[/color]); [color="#0000ff"][b]return[/b][/color] [color="#ff8000"]0[/color]; } ---------- Το μήνυμα προστέθηκε στις 14:27 ---------- Διόρθωσα ένα bug (if (a < 100))
m1cRo Δημοσ. 28 Δεκεμβρίου 2009 Δημοσ. 28 Δεκεμβρίου 2009 Δεν βρήκα κάποια έτοιμη συνάρτηση για να το κάνω αυτό και δεν είμαι σίγουρος για το πώς...! Έχει κάποιος καμιά ιδέα..!? Αυτό ακριβώς που θέλω να κάνω είναι από μιά συμβολοσειρά πχ την "ΑΑΑΑΑΑ" να φτιάξω εναν ακέραιο με βάση τον ASCII αριθμό του κάθε γράμματος, τον 656565656565 για το συγκεκριμένο παράδειγμα... Και όπως ανεφέρω και στον τίτλο ο ακαίρεος να είναι τύπου long long.. Ευχαριστώ για όποια βοήθεια ---------- Το μήνυμα προστέθηκε στις 11:57 ---------- Τελικά κάτι έφτιαξα... >#include<stdio.h> #include<math.h> int main(){ int i,d; char a[]="ABCDEFGH"; long long ar=0; printf("%d\n\n",sizeof(a)); d=2*(sizeof(a)-2); for (i=0; i<8; i++){ ar+=(int)a[i]*pow(10,d); d-=2; } printf("%lld\n\n", ar); return 0; } Αν ξέρετε κάποιο καλύτερο ή πιο γρήγορο τρόπο παρακαλώ γράψτε τον εδώ.. Είναι απλό type casting >char *str="AAAAAAAA"; if(strlen(str)%4!=0){ puts("Wrong string"); return; } LONGLONG *lng=(LONGLONG*)str;
kagelos Δημοσ. 28 Δεκεμβρίου 2009 Δημοσ. 28 Δεκεμβρίου 2009 Είναι απλό type casting >char *str="AAAAAAAA"; if(strlen(str)%4!=0){ puts("Wrong string"); return; } LONGLONG *lng=(LONGLONG*)str; Ο φίλος ζήτησε να γίνεται σε δεκαδικό σύστημα ο αριθμός με την μορφή XXYYZΖ. Αυτό που δείχνεις είναι σε δυαδικό (και δεκαεξαδικό) και επιπλέον πρέπει το string να είναι world aligned για να παίξει.
m1cRo Δημοσ. 28 Δεκεμβρίου 2009 Δημοσ. 28 Δεκεμβρίου 2009 Ο φίλος ζήτησε να γίνεται σε δεκαδικό σύστημα ο αριθμός με την μορφή XXYYZΖ.Αυτό που δείχνεις είναι σε δυαδικό (και δεκαεξαδικό) και επιπλέον πρέπει το string να είναι world aligned για να παίξει. Διάβασε καλά τι γραφει. Για "AAAAAA" θέλει ο αριθμός να είναι 6565656565.
kagelos Δημοσ. 28 Δεκεμβρίου 2009 Δημοσ. 28 Δεκεμβρίου 2009 Διάβασε καλά τι γραφει. Για "AAAAAA" θέλει ο αριθμός να είναι 6565656565. Μάλλον εσύ θα πρέπει να το δεις λίγο καλύτερα. char *s = "AAAA"; int l = *(int *)a; cout << l << endl; Το αποτέλεσμα είναι 1094795585 και όχι 65656565 που θέλει ο φίλος. Το 1094795585 σε hex είναι 0χ41414141. Για αυτό σου είπα πριν ότι ο τρόπος που δίνεις ισχύει για binary και hex. Όμως ζητήθηκε 65 για το Α, άρα μιλάμε για δεκαδικό. Επιπλέον ο τρόπος σου έχει λάθος έτσι και αλλιώς. char *s = "AAZZ"; int l = *(int *)a; cout << l << endl; Θα περιμέναμε 0χ41415Α5Α Όμως αν το τρέχουμε σε little endian (PC) σύστημα βγαίνει φυσικά ανάποδα, δηλαδή : 0χ5A5A4141
m1cRo Δημοσ. 28 Δεκεμβρίου 2009 Δημοσ. 28 Δεκεμβρίου 2009 Μάλλον εσύ θα πρέπει να το δεις λίγο καλύτερα. char *s = "AAAA"; int l = *(int *)a; cout << l << endl; Το αποτέλεσμα είναι 1094795585 και όχι 65656565 που θέλει ο φίλος. Το 1094795585 σε hex είναι 0χ41414141. Για αυτό σου είπα πριν ότι ο τρόπος που δίνεις ισχύει για binary και hex. Όμως ζητήθηκε 65 για το Α, άρα μιλάμε για δεκαδικό. Επιπλέον ο τρόπος σου έχει λάθος έτσι και αλλιώς. char *s = "AAZZ"; int l = *(int *)a; cout << l << endl; Θα περιμέναμε 0χ41415Α5Α Όμως αν το τρέχουμε σε little endian (PC) σύστημα βγαίνει φυσικά ανάποδα, δηλαδή : 0χ5A5A4141 Έχεις δίκιο . ---------- Το μήνυμα προστέθηκε στις 23:01 ---------- Έχεις δίκιο . Δικη μου έκδοση. >#include <stdio.h> #include <windows.h> #include <math.h> int main(int argc, char* argv[]) { char* buffer= "AAAZ" "\x09" "ZZAl" "\x07"; long long result=0; unsigned int len=strlen(buffer); int pwr=0; for(unsigned int i=0;i<len;i++){ if(buffer[len-i]>100){ pwr+=3; }else if(buffer[len-i]<10 && i!=0){ pwr++; }else if(buffer[len-i]>10 && buffer[len-i]<100){ pwr+=2; } long long temp=buffer[len-i-1]*pow(double(10),int(pwr)); result+=temp; } printf("%lld",result); getchar(); return 0; }
karabouzouk... Δημοσ. 29 Δεκεμβρίου 2009 Μέλος Δημοσ. 29 Δεκεμβρίου 2009 m1cRo ο τρόπος σου είναι σχοδόν ίδιος με τον δικό μου μόνο που παίρνεις και περιπτώσεις για το μέγεθος του ASCII αριθμού κάθε χαρακτήρα.. ευχαριστώ Τώρα θέλω να κάνω και το αντίθετο.. από έναν long long αριθμό να πάρω τους χαρακτήρες που αντιστιχούν στους αριθμούς ανα δύο. Δηλαδή θεωρώ ότι κάθε δύο ψηφία αντιστοιχούν σε ένα ASCII χαρακτήρα.. δηλαδή το 6566676869707172 να μεταφραστεί σε "ABCDEFGH" ---------- Το μήνυμα προστέθηκε στις 12:26 ---------- νομίζω ότι πρέπει να είναι περίπου έτσι το κύριο μέρος του.. >for(i=BLOCK_SIZE-1; i>=0; i--){ block[i]=intmi%100; intmi/=100; }
kagelos Δημοσ. 29 Δεκεμβρίου 2009 Δημοσ. 29 Δεκεμβρίου 2009 Δεν ξέρεις όμως αν ένας χαρακτήρας έχει 2 ή 3 ψηφία. Π.χ. το z έχει 3 ψηφία.
m1cRo Δημοσ. 29 Δεκεμβρίου 2009 Δημοσ. 29 Δεκεμβρίου 2009 Άλλος τρόπος είναι να τα κανεις μετατροπή σε string και να δουλεύεις με strings. Έχει δίκιο ο kagelos μήπως από την αρχή ήθελες να γίνετε μετατροπή σε hex και πίσω??
karabouzouk... Δημοσ. 29 Δεκεμβρίου 2009 Μέλος Δημοσ. 29 Δεκεμβρίου 2009 Άλλος τρόπος είναι να τα κανεις μετατροπή σε string και να δουλεύεις με strings. ακριβώς αυτός είναι ο σκοπός μου να τα μετατρεψω σε string και λόγο του ότι δεν έχουν σταθερό μήκος οι αριθμοί ASCII σκεύτηκα να τους περιορίσω μόνο στους διψήφιους μιας και η άσκηση δεν προωρίζεται για επαγκελματική χρήση. Αν χρησιμοποιήσουμε μόνο διψήφιουσ ASCII είναι σωστή η σκέψη μου..? αν έχετε κάποια πρόταση βέβαια είναι ευπρόσδεκτη.. ---------- Το μήνυμα προστέθηκε στις 13:16 ---------- Έχει δίκιο ο kagelos μήπως από την αρχή ήθελες να γίνετε μετατροπή σε hex και πίσω?? Όχι για το σκοπό που το θέλω δεν βοηθάει σε hex.. αλλά τι διαφορά έχει από το να τους μετατρέπω στο δεκαδικό..?
kagelos Δημοσ. 29 Δεκεμβρίου 2009 Δημοσ. 29 Δεκεμβρίου 2009 Όχι για το σκοπό που το θέλω δεν βοηθάει σε hex.. αλλά τι διαφορά έχει από το να τους μετατρέπω στο δεκαδικό..? Τεράστια. Ξέρεις ότι κάθε χαρακτήρας είναι 1 byte. Τώρα μετατρέποντάς το string σε σειρά δεκαδικών αριθμών δεν ξέρεις αν είναι διψήφιοι ή τριψήφιοι. Ενώ στο hex μέχρι το 256 είναι διψήφιοι οι αριθμοί (FF). Αν βέβαια θεωρήσεις τους αριθμούς σου διψήφιους τότε μπορείς να το κάνεις. Αλλά χάνεις όλους τους χαρακτήρες από 100 και πάνω.
m1cRo Δημοσ. 29 Δεκεμβρίου 2009 Δημοσ. 29 Δεκεμβρίου 2009 ακριβώς αυτός είναι ο σκοπός μου να τα μετατρεψω σε string και λόγο του ότι δεν έχουν σταθερό μήκος οι αριθμοί ASCII σκεύτηκα να τους περιορίσω μόνο στους διψήφιους μιας και η άσκηση δεν προωρίζεται για επαγκελματική χρήση.Αν χρησιμοποιήσουμε μόνο διψήφιουσ ASCII είναι σωστή η σκέψη μου..? αν έχετε κάποια πρόταση βέβαια είναι ευπρόσδεκτη.. ---------- Το μήνυμα προστέθηκε στις 13:16 ---------- Όχι για το σκοπό που το θέλω δεν βοηθάει σε hex.. αλλά τι διαφορά έχει από το να τους μετατρέπω στο δεκαδικό..? Το 10 δεν είναι δύναμη του 2 "γιαυτο" δεν μπορείς να είσαι σίγουρος στα όρια ενός αριθμού ενώ αν πάρεις το hex τότε κάθε byte αντιστοιχεί ακριβώς σε 2 hex characters ενώ κάθε character στον ascii πιάνει ακριβώς ένα byte αν σου δώσω στο δεκαδικό σύστημα έναν αριθμό 111 εσύ δεν μπορείς να ξέρεις αν είναι τρεις άσοι η 11 και 1 η κάτι άλλο ενώ αν σου δώσω σε δεκαεξαδικό 13f214 εδώ είσαι σίγουρος τι είναι τι, τα spas ανά 2 και έχεις 12 f2 14.
Evgenios1 Δημοσ. 30 Δεκεμβρίου 2009 Δημοσ. 30 Δεκεμβρίου 2009 Εαν το θελεις σε δεκαδικο, θα πρεπει να ορισεις ενα φορματ. Πχ το hex, ξερεις οτι ειναι του τυπου ff=byte, για το δεκατικο μπορεις να κανεις κατι σα και αυτο 000=byte Ετσι το max uint θα ειναι Hex=ffffffff dek=255255255255 και το Min Hex=00000000 del=000000000000 Ενα προχειρο κωδικα που εκανα >// ca_1.cpp : Defines the entry point for the console application. // #include "stdafx.h" #define cw(msg,str) printf("%s:%s\n",msg,str) #define _byte unsigned char void getDek(char* des,int value) { _byte* tmp = (_byte*) &value; sprintf(des,"%03d%03d%03d%03d",tmp[0],tmp[1],tmp[2],tmp[3]); } void getValue(char* dek,int* outValue); int _tmain(int argc, _TCHAR* argv[]) { char hex[4]; char dek[12]; int value = 123456789; sprintf(hex,"%x",value); cw("Hex value",hex); getDek(dek,value); cw("Dek value",dek); int tmpValue=0; getValue(dek,&tmpValue); printf("Value of dek is:%d\n",tmpValue); tmpValue=0; sscanf(hex,"%x",&tmpValue); printf("Value of hex is:%d\n",tmpValue); getchar(); return 0; } void getValue(char* dek,int* outValue) { _byte tmp[4]; sscanf(dek,"%03d%03d%03d%03d",&tmp[0],&tmp[1],&tmp[2],&tmp[3]); memcpy(outValue,tmp,4); } Εχει ενα bug στο σημειο >void getValue(char* dek,int* outValue) { _byte [color="Red"]tmp[/color][4]; sscanf(dek,"%03d%03d%03d%03d",&tmp[0],&tmp[1],&tmp[2],&tmp[3]); memcpy(outValue,tmp,4); } Αλλα δουλευει.
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.