Torna indietro   Hardware Upgrade Forum > Software > Programmazione

HONOR Magic 8 Pro: ecco il primo TOP del 2026! La recensione
HONOR Magic 8 Pro: ecco il primo TOP del 2026! La recensione
HONOR ha finalmente lanciato il suo nuovo flagship: Magic 8 Pro. Lo abbiamo provato a fondo in queste settimane e ve lo raccontiamo nella nostra recensione completa. HONOR rimane fedele alle linee della versione precedente, aggiungendo però un nuovo tasto dedicato all'AI. Ma è al suo interno che c'è la vera rivoluzione grazie al nuovo Snapdragon 8 Elite Gen 5 e alla nuova MagicOS 10
Insta360 Link 2 Pro e 2C Pro: le webcam 4K che ti seguono, anche con gimbal integrata
Insta360 Link 2 Pro e 2C Pro: le webcam 4K che ti seguono, anche con gimbal integrata
Le webcam Insta360 Link 2 Pro e Link 2C Pro sono una proposta di fascia alta per chi cerca qualità 4K e tracciamento automatico del soggetto senza ricorrere a configurazioni complesse. Entrambi i modelli condividono sensore, ottiche e funzionalità audio avanzate, differenziandosi per il sistema di tracciamento: gimbal a due assi sul modello Link 2 Pro, soluzione digitale sul 2C Pro
Motorola edge 70: lo smartphone ultrasottile che non rinuncia a batteria e concretezza
Motorola edge 70: lo smartphone ultrasottile che non rinuncia a batteria e concretezza
Motorola edge 70 porta il concetto di smartphone ultrasottile su un terreno più concreto e accessibile: abbina uno spessore sotto i 6 mm a una batteria di capacità relativamente elevata, un display pOLED da 6,7 pollici e un comparto fotografico triplo da 50 MP. Non punta ai record di potenza, ma si configura come alternativa più pragmatica rispetto ai modelli sottili più costosi di Samsung e Apple
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 13-03-2006, 02:51   #1
fuocofatuo
Senior Member
 
L'Avatar di fuocofatuo
 
Iscritto dal: Nov 2005
Città: Bordeaux - France
Messaggi: 364
[C] Interpretare stringhe come altri tipi di dato

FORMULAZIONE BREVE DEL PROBLEMA
Ho tre long. Come posso farli diventare una stringa di 22 caratteri e da lì nuovamente tre long?


FORMULAZIONE ARTICOLATA
Sto programmando pressochè per la prima volta in C, e mi sono un po' impiantato su un problema (credo) molto banale.

Devo creare due programmi, ciascuno con un paio di thread, che si scambiano informazioni tramite pacchetti UDP di dimensione fissa. Per inviare e ricevere i pacchetti uso la socket API relativa, e di conseguenza le funzioni "sendto" e "recvfrom". Con questi pacchetti devo inviare un int e un dato "timespec", inseriti in un messaggio di esattamente 22 byte (i byte in sovrappiù possono assumere qualsiasi valore).

La soluzione che mi sembra più semplice consiste nell'assimilare il contatore e il timespec a tre long allocati in posizioni consecutive di memoria, e nel fargli considerare e spedire una stringa di 22 caratteri che parta da quella posizione. Credo però che, sapendo giocare bene con malloc e cast, sia possibile anche fare a meno di passare ai long, e utilizzare direttamente i dati int e timespec originali. Ammettendo anche che il ragionamento possa essere corretto, il codice che ho scritto non lo è... mi potete dare una mano?
__________________
- fuocofatuo -
fuocofatuo è offline   Rispondi citando il messaggio o parte di esso
Old 13-03-2006, 08:45   #2
sottovento
Senior Member
 
L'Avatar di sottovento
 
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
Ciao,
da quello che ho capito dalla formulazione articolata, non ti serva convertire tre long in formato stringa.

Ti basta:
- costruire una struttura contenente i dati che vuoi spedire, "riempiendola" fino a 22 byte con campi non utilizzati;
- convertire le long dal formato locale (della tua macchina, intendo) al formato di rete mediante la macro htonl ();
- spedire

Alla ricezione ti basta fare le operazioni contrarie.

=============
Se invece vuoi spedire i dati come stringhe di 2 byte, li potresti convertire usando la sprintf().

Ricordati pero' che se scrivi:

char stringa[22];
sprintf (stringa, %d%d", l1, l2);

(o, su certe macchine
sprintf (stringa, "%ld%ld");
)

estrarre le informazioni ti risultera' difficile. Devi ricorrere a qualche trucco, per esempio inserire uno spazio od un altro carattere fra le stringhe stesse:

sprintf (stringa, "%ld %ld");

nella decodifica, mediante la strchr() puoi cercare lo spazio e dividere la stringa in due, poi mediante la atol() riconverti in long.

ATTENZIONE - la sprintf() non fa controllo sulla lunghezza. 22 caratteri non sono sempre sufficienti per 2 long.
Per esempio, se hai 32 bit, hai 11 cifre piu' il segno. Aggiungi il terminatore di stringa e hai sfondato. Figuriamoci se ne hai 64.
Pertanto ti consiglio di non convertire in stringa

High Flying
Sottovento
sottovento è offline   Rispondi citando il messaggio o parte di esso
Old 13-03-2006, 13:23   #3
il_luridone
Member
 
L'Avatar di il_luridone
 
Iscritto dal: Oct 2004
Città: Bologna
Messaggi: 50
Io faccio così:

lato client (ovvero chi spedisce)

mi riservo un array di 22 char:
Codice:
char buffer[22];     // puoi anche usare malloc, come preferisci
Ho i tre long da spedire: li converto in network byte order:

Codice:
conv_primo_long = htonl (primo_long);
conv_secondo_long = htonl (secondo_long);
conv_terzo_long = htonl (terzo_long);
copio i tre valori nell'array in modo che siano consecutivi:

Codice:
memcpy (buffer, &conv_primo_long, sizeof (conv_primo_long));
mempcy (buffer + sizeof (conv_primo_long),
        &conv_secondo_long,
        sizeof (conv_secondo_long));
mempcy (buffer + sizeof (conv_primo_long) + sizeof (conv_secondo_long),
        &conv_terzo_long,
        sizeof (conv_terzo_long));
e fai sendmsg con il buffer

lato server (ovvero chi riceve)

recvmsg di tutto il buffer, poi

Codice:
primo_long = ntohl ( *( (long int *) buffer ) );
secondo_long = ntohl ( *( (long int *) (buffer + sizeof (long int) ) ) );
terzo_long = ntohl ( *( (long int *) (buffer + 2* sizeof (long int) ) ) );
__________________
And the salad is frightful!
I have an important message to deliver to all the cute people all over the world. If you're out there and you're cute, maybe you're beautiful. I just want to tell you something: there's more of us ugly mother-fuckers than you are, hey-y, so watch out.
il_luridone è offline   Rispondi citando il messaggio o parte di esso
Old 13-03-2006, 20:11   #4
fuocofatuo
Senior Member
 
L'Avatar di fuocofatuo
 
Iscritto dal: Nov 2005
Città: Bordeaux - France
Messaggi: 364
Grazie a tutti dei consigli. Ho risolto in questa maniera:
Codice:
char message[22];
unsigned long int *pointer;

pointer = (unsigned long int *)&message;
*pointer = htonl((long)packetCounter);
pointer++;
*pointer = htonl((long)actualTime.tv_sec);
pointer++;
*pointer = htonl((long)actualTime.tv_nsec);
e in maniera analoga nel programma ricevitore. Sto iniziando a combinare con i puntatori solo ora...
__________________
- fuocofatuo -
fuocofatuo è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


HONOR Magic 8 Pro: ecco il primo TOP del 2026! La recensione HONOR Magic 8 Pro: ecco il primo TOP del 2026! L...
Insta360 Link 2 Pro e 2C Pro: le webcam 4K che ti seguono, anche con gimbal integrata Insta360 Link 2 Pro e 2C Pro: le webcam 4K che t...
Motorola edge 70: lo smartphone ultrasottile che non rinuncia a batteria e concretezza Motorola edge 70: lo smartphone ultrasottile che...
Display, mini PC, periferiche e networking: le novità ASUS al CES 2026 Display, mini PC, periferiche e networking: le n...
Le novità ASUS per il 2026 nel settore dei PC desktop Le novità ASUS per il 2026 nel settore de...
Apple, Xiaomi, Motorola, Google e vivo: ...
Robot aspirapolvere a metà prezzo: Amazo...
L'AI distruggerà milioni di posti di lav...
Gli obbligazionisti di Oracle intentano ...
Amazon scatenata: robot aspirapolvere, s...
007 First Light, requisiti sbagliati: IO...
Il secondo leasing sociale francese ragg...
Anche Chrome diventerà un browser...
Huawei FreeClip 2 in arrivo in Italia: c...
Honda promette la roulotte del futuro, m...
Rincari non solo per gli utenti: Intel e...
Gemini può usare i tuoi dati priv...
OPPO lancia in Italia la serie Reno15: n...
Stazione Spaziale Internazionale: rientr...
Forza Horizon 6: spunta la possibile dat...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 15:28.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v