array auf inhalt überprüfen (is binary?)
-
Dir kann genauer geantwortet werden, wenn du folgende Angaben machst(hier ist ein ganz konkretes Mehr an Information sehr hilfreich:
grundsetzliche Angaben:
- das Betriebssystem, auf dem du arbeitest
- der Compiler mit dem du arbeitest und dessen Version,
denn einige Probleme tauchen nur bei bestimmten Betriebssystemen auf und auch dort nur bei bestimmten Compilern.Wenn du Code hier ins Forum stellst ist es für die Hilfe wichtig, wie du ihn verwendest. Viele Probleme werden erst im größeren Zusammenhang deutlich.
Konstruiere also ein knappes Beispiel für die Verwendung deines Codeabschnittes. Dabei muß deutlich werden:
- wie deklarierst du die in deinem Codeabschnitt verwendeten Variablen (Typ und Initialwert als Codefragment)?
- Wie weist du diesen Variablen ihren Wert zu (in der Deklaration oder über eine Zuweisung - als Codefragment)?
- Beschreibe mit deinen eigenen Worten, welchen Inhalt dise Variablen deiner Meinung nach ganz konkret haben (hier kann sich Vorstellung und Wirklichkeit unterscheiden). 'Konkret' heißt bezogen auf dein Problem zum Beispiel: die Variable 'buf' ist eine Zeichenkette mit dem Inhalt "000101000\0" oder "010011hhgghh\0"
- gleiches gilt für die Inhalte der für dich interessanten Variablen am Ende deines Codeabschnittes (auch wenn es zunächst trivial erscheint, hier lauern subtile Fehlerquellen).Bei einer Funktion (wie hier von dir ins Netz gestellt) ist es wichtig zu wissen:
- Wie und mit welchen Parametern rufst du diese Funktion auf? (sind die Parameter Variablen oder Konstanten, gilt das oben genannte - Deklaration und Zuweisung als Codeausschnitt sowie deine Vorstellung über den Inhalt mit deinen eigenen Worten)
- Wie werden die Rückgabewerte verwendet (Zuweisung an eine andere Variable - dann auch angeben, wie diese deklariert ist - oder Verwendung als Bedingung in einer Schleife)?
-
Hallo,
Da bin ich ja anscheinend auf einen Profi gestoßen. Vielen Dank für die ausführliche Hilfe. Jetzt funktioniert alles einwandfrei und ich hab einiges dazugelernt!
mfg Christoph
-
Hallo,
Leider hab ich jetzt noch ein kleines problem bei der Verarbeitung der Binärzahl. Es soll nun stdin (eine maximal 32bit große Binärzahl) in sbin eingelesen werden. Dann soll sbin in einen unsigned long integer (wegen 32bit) übernommen werden.
Das ganze funktioniert bis zu 10bit (1111111111). Ab 11bit kommt irgendeine Zahl heraus. (-1773790777)Ich verwende eclipse mit MinGW unter vista x64.
mfg Christoph
int main() { char sbin[32+1]; unsigned long int bin; scanf("%s",sbin); printf("%s\t",sbin); sscanf(sbin,"%li",&bin); printf("%li\t",bin); return 0; }
-
Hi!
Mit sscanf geht das kaum mit einem Compiler binär. Was du suchst ist strtoul,
guckst du hier:char sbin[64]; unsigned long num; strcpy ( sbin, "11110000" ); num = strtoul ( sbin, NULL, 2 ); printf ( "%lu\n", num );
-
Hallo,
Funktioniert mit strtoul leider auch nicht bei mehr als 10bit.
mfg Christoph
-
symbian schrieb:
Hallo,
Funktioniert mit strtoul leider auch nicht bei mehr als 10bit.
mfg Christophich glaube du weist nicht was ein Bit ist, 10 Bit = 2 hoch 10 also 1024 im Dezimalsystem d.h. du kannst mit 10 bit die Zahlen von 0-1023 darstellen, nur weil du 10 einser hintereinander sind das noch lange keine 10 Bit
-
Hallo,
Sry mein Fehler. Ich bin mir nur leider nicht ganz klar bei folgender Formulierung:
...Programm, welches binäre Zahlen (bis max 32-bit) von stdin zeilenweise einliest.Sind damit 32 bit Zeichen (01), oder eine dezimal Zahl aus 32 bit (=2^32 = 4294967296 = 10 Zeichen) gemeint?
mfg Christoph
-
Klappt doch:
strcpy ( sbin, "11111111111" ); // 11 Bit num = strtoul ( sbin, NULL, 2 ); printf ( "%lu\n", num ); strcpy ( sbin, "1111111111111111" ); // 16 Bit num = strtoul ( sbin, NULL, 2 ); printf ( "%lu\n", num ); strcpy ( sbin, "11111111111111111111111111111111" ); // 32 Bit num = strtoul ( sbin, NULL, 2 ); printf ( "%lu\n", num );Vielleicht machst du etwas anderes falsch.
Achte auch auf den Formatstring; "%lu" steht z.B. für unsigned long int, "%li" für signed long int.
Gruß,
B.B.
-
So wie ich das sehe läuft es darauf hinaus daß du einen String einliest der aus einsen und nullen besteht. Z.B.
1010010110 = 1*2^9 + 0*2^8 + 1*2^7 + 0*2^6 + 0*2^5 + 1*2^4 + 0*2^3 + 1*2^2 + 1*2^1 + 0*2^0das waren jetzt halt mal nur 10 Bit für 32 Bit analog so weitermachen, den String fährst du halt Zeichen für Zeichen durch und addiert die Teile.
u_int CalcBuffer(char *buffer){ int len, i; u_int result=0; len = strlen(buffer); if(len > 32){ sprintf("Your String is Scheissendreck); return 0; } for(i = len - 1; i >= 0; i--){ if((buffer[i] < 48) || (buffer[i] > 49)){ sprintf("Your String is Scheissendreck); return 0; } result += (buffer[i] - 48)*(u_int)pow(2, (double)i); } return result; }
-
Hallo,
Leider kann ich diese Variante nicht verwenden (ich muss den gesamten String zur weiterverarbeitung als 32 stellige Zahl einlesen). macht also 10^32 als benötigten maximalwert für die zahl. 10^32 entspricht 2^106.3...
Also benötige ich einen Ganzzahl-Datentyp mit min 107bit, den es nach meinem Wissen leider nicht gibt.mfg Christoph
-
@B.B.
hab gerade gemekert, dass mein problem bei strtoul darin besteht, dass ich die funktion falsch interpretiert habe. strtoul interpretiert den string als binärzahl und konvertiert diesen. Ich möchte aber die binärzahl 1:1 übernehmen. also dass dann in bin auch wirklich die zahl 110 steht und nicht eine konvertierte 6.
mfg Christoph
-
symbian schrieb:
Ich möchte aber die binärzahl 1:1 übernehmen. also dass dann in bin auch wirklich die zahl 110 steht und nicht eine konvertierte 6.
hä? Das System legt sowieso alles im Binäermodus. '6' ist nur eine Darstellung auf dem Bildschirm für die dummen Menschen, die mit '110' nichts anfangen können. Also Wert der Zahl mit ihrer Darstellung nicht verwechseln!
strtoul("110", NULL, 2)liefert die 110 zurück. Was soll es sonst zurückgeben?edit: wenn du nur überprüfen willst, ob die Eingabe tatsächlich nur eine Binärzahl hat und sonst keine andere Zeichen, dann kannst folgendes machen:
char *endptr; strtoul(eingabe, &endptr, 2); if(*endptr) { printf("Alter, gib nur eine Binärzahl ein ohne weitere Zeichen!!!\n"); .... }[klugscheisser]
btw: muss ich jede Woche erklären, wie strtoul benutzt wird?
[/klugscheisser]
-
Hallo,
Ich glaub wir reden ein wenig aneinander vorbei:
Das Problem ist der Datentyp. Ich benötige minimum 107bit für eine 32stellige Zahl. strtoul liest aber in einen unsigned long int ein. der hat aber nur 32bit=10stellige Zahl. (4294967295).(wegen dem "konvertierungsproblem": strtoul(str,NULL,2) konvertiert. strtoul(str,NULL,0) liefert den wert 1:1.)
mfg Christoph
-
symbian schrieb:
Hallo,
Leider kann ich diese Variante nicht verwenden (ich muss den gesamten String zur weiterverarbeitung als 32 stellige Zahl einlesen). macht also 10^32 als benötigten maximalwert für die zahl. 10^32 entspricht 2^106.3...
Also benötige ich einen Ganzzahl-Datentyp mit min 107bit, den es nach meinem Wissen leider nicht gibt.mfg Christoph
Nimmsu 4 unsigned long, z.B. als Array.
Gruß,
B.B.
-
symbian schrieb:
Hallo,
Ich glaub wir reden ein wenig aneinander vorbei:
Das Problem ist der Datentyp. Ich benötige minimum 107bit für eine 32stellige Zahl. strtoul liest aber in einen unsigned long int ein. der hat aber nur 32bit=10stellige Zahl. (4294967295).(wegen dem "konvertierungsproblem": strtoul(str,NULL,2) konvertiert. strtoul(str,NULL,0) liefert den wert 1:1.)
mfg Christoph
strtoul mi 0 an Ende entscheidet autoamatisch, welches Zahlsystem er nimmt, bei einer 2 zwingst du dem System das dual System, das ist der große Unterschied.
strtoull liefert ein unsigned long long int was in der Regel uint64_t darstellt. Wenn du aber 107 bits brauchst, dann gibt es keine Standardfunktion, die 107 bit breite Zahlen zurückliefert. Also muss du deine Eingabe selber splitten und 2 Mal strtoull aufrufen.
-
symbian schrieb:
... Ich benötige minimum 107bit für eine 32stellige Zahl. strtoul liest aber in einen unsigned long int ein. der hat aber nur 32bit=10stellige Zahl. (4294967295).
mfg ChristophWozu willst du den String in ein biäres Format quetschen?
Wozu ist das gut?

-
Hallo Chritoph,
Du möchtest also erreichen, daß überall wo deine Zeichenkette eine '1' enthält, das zugehörige Bit in der Integerzahl gesetzt wird und da, wo in deiner Zeichenkette eine '0' steht, das zugehörige Bit zurückgesetzt wird?
Dann ist mir noch nicht gan klar, wie du auf eine Zahl mit 107 Bit kommst? Wie kommt die '107' zustande?
Zur Klärung der Probleme hier ist wichtig zu wissen, was du mit der umgewandelten Zahl anstellen möchtest. Wenn du vor hast, mit was längerem als 'unsigned long' zu rechnen, dann viel Spaß. Die benötigten Funktionen mußt du dir dann wohl alle selbst schreiben oder eine gute Bibliothek finden. Aber ich glaube, das ist von dir nicht so gewollt.
mfg Mario
-
Hallo,
Ich möchte die eingelesenen (32 stelligen) Zahl verwenden um diese dann in decimal und hex zu konvertieren (ich weiß, dass es mit array funktioniert), aber ich würde es gerne numerisch machen:
z.b. in dec
for(bit=0,dec=0,exp=0;bin>0;) { bit=bin%10; bin/=10; for(i=0;i<exp;i++)bit*=2; dec+=bit; exp++; }Die 107bit kommen daher, dass die größte 32stellige Zahl 2^106.3 ist
also 107bit benötigt um dargestellt zu werden.mfg christoph
-
Hallo Christoph,
du bist dir sicher, daß du eine 32 stellige Dezimalzahl meinst?
Bisher war immer die Rede von einer 32 stelligen Binärzahl. Und die paßt in einen unsigned long - ein Bit je Stelle.Willst du mit größeren Zahlen als 2^32 arbeiten, sieh dir mal die folgende Bibliothek an: GNU MP Bignum Library.
Informationen zu dieser Bibliothek und die Bibliothek selbst findest du unter http://gmplib.orgmfg Mario
-
Dies ist zwar keine 32 stellige Zahl, aber das Prinzip ist das gleiche:
1348 = 8100 + 4101 + 3 * 102 + 1 * 103Daraus möchtest du nun ein binäres Format erzeugen ( warum auch immer
). Müsste man sich vorher überlegen, wie die Einsen und Nullen gespeichert werden sollen.
So:
typedef unsigned long uint128[4]; 128 Bit Typ
Oder so:
typedef unsigned char uint[128]; '128 Bit' TypDie zweite Variante dürfte handlicher und schneller in der Ausführung sein ( Vermutung ). Braucht etwas mehr Speicher, aber wen juckts.
Ist die Zahl erstmal konvertiert, kannst du sie immer noch recht einfach in den ersten Typ umwandeln.Gruß,
c.