Forum: Compiler & IDEs char array nach long


von DerDumme (Gast)


Lesenswert?

Ich habe vor einigen Wochen damit begonnen mir das Webserver-Projekt des 
Herrn Radig vorzunehmen. Ich habe da so meine liebe Not mit der 
Variablen dhcp_lease und wie diese anhand des char-arrays "gefüllt" 
wird.

In der Datei dhcpc.c wird dhcp_lease als unsigned long bestimmt. Nach 
meinem Verständnis sollte es sich fortan also um eine 32 bit schwere 
Variable handeln in der 4 Zeichen abgelegt werden können sollten.

In der Funktion unsigned char dhcp(void) soll die Variable dhcp_lease 
wie folgt gefüllt werden:
1
   dhcp_lease = (*((unsigned long*)&cache.lease[0]));

Weiter oben in derselben Funktion steht folgendes:
1
   if((dhcp_state == DHCP_STATE_FINISHED) && (dhcp_lease < 600))

Innerhalb der Webseite die in webpage.h abgelegt wird habe ich eine neue 
"Ersetzung" mit dem Namen %LEASE, welche durch folgende Zeile in httpd.c 
ersetzt wird, eingebaut:
1
   if(strncasecmp_P("LEASE", http_entry[index].new_page_pointer, 5) == 0)
2
      {
3
      ltoa(dhcp_lease, var_conversion_buffer, 10);
4
      str_len = strnlen(var_conversion_buffer, CONVERSION_BUFFER_LEN);
5
      memmove(&eth_buffer[TCP_DATA_START + a], var_conversion_buffer, str_len);
6
      a = a + (str_len - 1);
7
      http_entry[index].new_page_pointer = http_entry[index].new_page_pointer + 5;
8
      }

Verwende ich den Code im "Original" wird mir eine LeaseTime angezeigt 
die ein bischen mehr enthält als das was mein Router eigentlich vorhat. 
Das geht in die Millionen Sekunden. Dieses "dhcp_lease < 600" dürfte in 
Jahren nicht fällig werden. Mein Router vergibt eine IP für 1800 
Sekunden. Ich habe aus der 600 also eine 1770 gemacht um zu sehen dass 
da nach 30 Sekunden etwas geschieht. Fehlanzeige. Da passt also etwas 
nicht.

Ich dachte mir also, ich ersetzte
1
   dhcp_lease = (*((unsigned long*)&cache.lease[0]));

durch
1
   dhcp_lease = 0;
2
   dhcp_lease = dhcp_lease + (cache.lease[3] <<  0);
3
   dhcp_lease = dhcp_lease + (cache.lease[2] <<  8);
4
   dhcp_lease = dhcp_lease + (cache.lease[1] << 16);
5
   dhcp_lease = dhcp_lease + (cache.lease[0] << 24);

Beim compilieren erhalte ich sodann folgenden Fehler:
1
   left shift count >= width of type

Kann mir mal bitte jemand erklären wie ich in dieses unsigned long 4 
bytes aus dem Char-Array reingeprügelt bekomme?

von DerDumme (Gast)


Lesenswert?

Also das was mir da in dhcp_lease abgelegt wird hat den Wert 134676480 
was 0x08070000 entspricht. Es sollte jedoch 1800 also 0x00000708. Das 
sieht mir irgendwie verdreht aus.

Das ändert jetzt allerdings nichts an meinem Problem, dieses char, wie 
ich zuvor beschrieb, in ein long rein zubekomme.

von DerDumme (Gast)


Lesenswert?

Ja, ganz toll. Muss ich erst hier schreiben um auf folgende Idee zu 
kommen:
1
   dhcp_lease = (*((unsigned long*)&cache.lease[0]));

durch
1
   dhcp_lease = HTONS32((*((unsigned long*)&cache.lease[0])));

ersetzen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.