Torna indietro   Hardware Upgrade Forum > Software > Programmazione

OPPO Find X9 Pro: il camera phone con teleobiettivo da 200MP e batteria da 7500 mAh
OPPO Find X9 Pro: il camera phone con teleobiettivo da 200MP e batteria da 7500 mAh
OPPO Find X9 Pro punta a diventare uno dei riferimenti assoluti nel segmento dei camera phone di fascia alta. Con un teleobiettivo Hasselblad da 200 MP, una batteria al silicio-carbonio da 7500 mAh e un display da 6,78 pollici con cornici ultra ridotte, il nuovo flagship non teme confronti con la concorrenza, e non solo nel comparto fotografico mobile. La dotazione tecnica include il processore MediaTek Dimensity 9500, certificazione IP69 e un sistema di ricarica rapida a 80W
DJI Romo, il robot aspirapolvere tutto trasparente
DJI Romo, il robot aspirapolvere tutto trasparente
Anche DJI entra nel panorama delle aziende che propongono una soluzione per la pulizia di casa, facendo leva sulla propria esperienza legata alla mappatura degli ambienti e all'evitamento di ostacoli maturata nel mondo dei droni. Romo è un robot preciso ed efficace, dal design decisamente originale e unico ma che richiede per questo un costo d'acquisto molto elevato
DJI Osmo Nano: la piccola fotocamera alla prova sul campo
DJI Osmo Nano: la piccola fotocamera alla prova sul campo
La nuova fotocamera compatta DJI spicca per l'abbinamento ideale tra le dimensioni ridotte e la qualità d'immagine. Può essere installata in punti di ripresa difficilmente utilizzabili con le tipiche action camera, grazie ad una struttura modulare con modulo ripresa e base con schermo che possono essere scollegati tra di loro. Un prodotto ideale per chi fa riprese sportive, da avere sempre tra le mani
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 30-05-2006, 16:45   #1
Manugal
Senior Member
 
L'Avatar di Manugal
 
Iscritto dal: Jan 2001
Città: Villanova di Guidonia (RM)
Messaggi: 1079
[C] Invertire ordine dei byte di un dobule

Ciao a tutti!

Devo inserire in un sorgente una direttiva che a seconda se la macchina sul quale vado a eseguire la macchina è Little Endian o Big Endian, mi inverta l'ordine dei byte di un double. Devo scrivere una cosa del genere:

Codice:
#include<endian.h>
...
#if __BYTE_ORDER==__LITTLE_ENDIAN
...
#endif
#if __BYTE_ORDER==__BIG_ENDIAN
...
#endif
Però non so come fare questa inversione. Chi può aiutarmi? Grazie
Manugal è offline   Rispondi citando il messaggio o parte di esso
Old 30-05-2006, 17:19   #2
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Quote:
Originariamente inviato da Manugal
Devo inserire in un sorgente una direttiva che a seconda se la macchina sul quale vado a eseguire la macchina è Little Endian o Big Endian, mi inverta l'ordine dei byte di un double.
A parte il little/big endian della macchina, la sequenza di 8 byte del double come ce l'hai o la devi fare??? Il problema del little/big endian sui dati ce l'hai solo quando devi leggere/scrivere un dato da qualche parte in un endian ben preciso.
Non so se mi sono spiegato ... se qualcuno mi da un file binario e mi dice che dentro c'è un double in BE, se la mia macchina è già in BE, non devo fare niente, altrimenti lo devo invertire.
Volevo capire cioè esattamente cosa devi fare.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 30-05-2006, 17:29   #3
il_luridone
Member
 
L'Avatar di il_luridone
 
Iscritto dal: Oct 2004
Città: Bologna
Messaggi: 50
Sapendo che su internet i byte più significativi vengono prima, potresti utilizzare le funzioni ntohl e htonl.

Ti copioincollo la man page:

Codice:
NAME
       htonl,  htons,  ntohl,  ntohs - convert values between host and network
       byte order

SYNOPSIS
       #include <arpa/inet.h>

       uint32_t htonl(uint32_t hostlong);

       uint16_t htons(uint16_t hostshort);

       uint32_t ntohl(uint32_t netlong);

       uint16_t ntohs(uint16_t netshort);

DESCRIPTION
       The htonl() function converts the unsigned integer hostlong  from  host
       byte order to network byte order.

       The htons() function converts the unsigned short integer hostshort from
       host byte order to network byte order.

       The ntohl() function converts the unsigned integer netlong from network
       byte order to host byte order.

       The  ntohs() function converts the unsigned short integer netshort from
       network byte order to host byte order.

       On the i80x86 the host byte order  is  Least  Significant  Byte  first,
       whereas  the  network byte order, as used on the Internet, is Most Sig-
       nificant Byte first.

CONFORMING TO
       SUSv3.

       Some  systems  require  the  inclusion  of  <netinet/in.h>  instead  of
       <arpa/inet.h>.

SEE ALSO
       gethostbyname(3), getservent(3)
__________________
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 30-05-2006, 17:31   #4
il_luridone
Member
 
L'Avatar di il_luridone
 
Iscritto dal: Oct 2004
Città: Bologna
Messaggi: 50
Quote:
Originariamente inviato da andbin
Volevo capire cioè esattamente cosa devi fare.
In effetti non si capisce bene se devi invertire l'endianess del double a prescindere da quale usi il sistema, oppure se devi uniformare l'endianess del double a quella del sistema.
__________________
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 30-05-2006, 17:40   #5
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Quote:
Originariamente inviato da il_luridone
Sapendo che su internet i byte più significativi vengono prima, potresti utilizzare le funzioni ntohl e htonl.
Uhm ... non credo proprio che possano essere utili. Un double è di 64 bit, quelle funzioni operano su 16 o 32 bit, quindi non puoi usarle, neanche "accoppiate".
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 30-05-2006, 18:40   #6
Manugal
Senior Member
 
L'Avatar di Manugal
 
Iscritto dal: Jan 2001
Città: Villanova di Guidonia (RM)
Messaggi: 1079
Infatti quelle funzioni non posso usarle. Cmq mi serve perché dovrò leggere/scrivere double da/su file binari. Mentre per quanto riguarda gli interi e gli short questa procedura c'è (infatti sono quelle funzioni di cui mi avete parlato poco fa), per i double devo implementarla io. Devo, a prescindere, invertire l'endianness del double perché questo programma non si sa a priori dove verrà eseguito.
Manugal è offline   Rispondi citando il messaggio o parte di esso
Old 31-05-2006, 11:59   #7
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Ci ho pensato un pochino. Si può fare così:
Codice:
#include <endian.h>

void swap_endian_double (double *pd)
{
    char *p = (char*) pd;
    char t;

    t = p[0];  p[0] = p[7];  p[7] = t;
    t = p[1];  p[1] = p[6];  p[6] = t;
    t = p[2];  p[2] = p[5];  p[5] = t;
    t = p[3];  p[3] = p[4];  p[4] = t;
}

void adjust_double_be (double *pd)
{
#if __BYTE_ORDER == __LITTLE_ENDIAN
    swap_endian_double (pd);
#endif
}

void adjust_double_le (double *pd)
{
#if __BYTE_ORDER == __BIG_ENDIAN
    swap_endian_double (pd);
#endif
}
EDIT: aggiustati i nomi delle funzioni
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%)

Ultima modifica di andbin : 31-05-2006 alle 14:17.
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 31-05-2006, 14:02   #8
Manugal
Senior Member
 
L'Avatar di Manugal
 
Iscritto dal: Jan 2001
Città: Villanova di Guidonia (RM)
Messaggi: 1079
Grazie mille andbin. Vedendo il codice pensavo fosse molto più difficile (non che non lo sia questo). Quindi quando io dovrò scrivere su file binario swap_double() oppure devo richiamare adjust_double_from_le() (nel caso in cui sono in un'architettura le)?
Manugal è offline   Rispondi citando il messaggio o parte di esso
Old 31-05-2006, 14:04   #9
Manugal
Senior Member
 
L'Avatar di Manugal
 
Iscritto dal: Jan 2001
Città: Villanova di Guidonia (RM)
Messaggi: 1079
Mi sorge un altro dubbio, ma un char non è più "piccolo" di un double? Cioè facendo quel cast a puntatore a char in teoria si perderebbero informazioni su quel numero, o sbaglio?
Manugal è offline   Rispondi citando il messaggio o parte di esso
Old 31-05-2006, 14:15   #10
trallallero
Senior Member
 
L'Avatar di trallallero
 
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
Ciao io son nuovo (anche se seguo passivamente da tempo ...)

io ho fatto cosi:

Codice:
/*------------------------------*\
  DEFINISCI LA MACRO CHE "SWAPPA" 
  LA TROVI ANCHE SU byteswap.h
\*------------------------------*/
#define swap_64(n)  (                        \
      (((n) & 0xff00000000000000ull) >> 56)  \
    | (((n) & 0x00ff000000000000ull) >> 40)  \
    | (((n) & 0x0000ff0000000000ull) >> 24)  \
    | (((n) & 0x000000ff00000000ull) >> 8 )  \
    | (((n) & 0x00000000ff000000ull) << 8 )  \
    | (((n) & 0x0000000000ff0000ull) << 24)  \
    | (((n) & 0x000000000000ff00ull) << 40)  \
    | (((n) & 0x00000000000000ffull) << 56) )


/*-------------------------*\
   FUNZIONE CHE "SWAPPA"
\*-------------------------*/
double Swap_64( double d )
{
   long long ll;

   memcpy( &ll, &d, sizeof(long long) );
   ll = swap_64(ll);
   memcpy( &d, &ll, sizeof(long long) );

   return d;
}
In pratica converti il double in long long con memcpy (ma non lo devi castare!) per far funzionare la MACRO
e poi lo riconverti in double

l'ho anche testato con un mini prog in C e funzica


Codice:
/*--------*\
\*--------*/
int main()
{
   double d = 123.45;
   int    i;
   char   c[8];

   printf( "d: <%f>\n", d );

   d = Swap_64(d);
   printf( "d: <%f>\n", d );
   memcpy( c, &d, sizeof(long long) );
   
   for ( i = 0; i < 8; i++ )
      printf( "%X", c[i] );

   puts("");

   d = Swap_64(d);
   printf( "d: <%f>\n", d );
   memcpy( c, &d, sizeof(long long) );
   
   for ( i = 0; i < 8; i++ )
      printf( "%X", c[i] );
   puts("");

   return 0;
}
ciao
trallallero è offline   Rispondi citando il messaggio o parte di esso
Old 31-05-2006, 14:21   #11
Manugal
Senior Member
 
L'Avatar di Manugal
 
Iscritto dal: Jan 2001
Città: Villanova di Guidonia (RM)
Messaggi: 1079
Scusa ma long long in ANSI C esiste? E cmq io devo fare uno swap sia se sono in BE che in LE. Quando scrivo su file binario un double, prima modifico la variabile che conterrò temporaneamente quel double e poi la converto tramite la tua swap prima di scriverla su file?
Manugal è offline   Rispondi citando il messaggio o parte di esso
Old 31-05-2006, 14:25   #12
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Quote:
Originariamente inviato da Manugal
Grazie mille andbin. Vedendo il codice pensavo fosse molto più difficile (non che non lo sia questo). Quindi quando io dovrò scrivere su file binario swap_double() oppure devo richiamare adjust_double_from_le() (nel caso in cui sono in un'architettura le)?
Ho aggiustato adesso i nomi alle funzioni, giusto per renderle più chiare.

Quando dovrai scrivere su file, dovrai usare la adjust_double_XX e non la swap_endian_double.
Esempio:
Codice:
double d = ....;
double d_tmp;

....

d_tmp = d;
adjust_double_be (&d_tmp);
fwrite (&d_tmp, 1, sizeof (d_tmp), f);
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 31-05-2006, 14:29   #13
Manugal
Senior Member
 
L'Avatar di Manugal
 
Iscritto dal: Jan 2001
Città: Villanova di Guidonia (RM)
Messaggi: 1079
Ho capito grazie. Speriamo che funzioni.
Manugal è offline   Rispondi citando il messaggio o parte di esso
Old 31-05-2006, 14:31   #14
trallallero
Senior Member
 
L'Avatar di trallallero
 
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
Quote:
Originariamente inviato da Manugal
Scusa ma long long in ANSI C esiste? E cmq io devo fare uno swap sia se sono in BE che in LE. Quando scrivo su file binario un double, prima modifico la variabile che conterrò temporaneamente quel double e poi la converto tramite la tua swap prima di scriverla su file?

'azz! ANSI il long long ??? sai che non lo so
pero' ho lavorato su molto SO unix e l'ho sempre trovato.
indago ...
trallallero è offline   Rispondi citando il messaggio o parte di esso
Old 31-05-2006, 14:31   #15
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Quote:
Originariamente inviato da Manugal
Mi sorge un altro dubbio, ma un char non è più "piccolo" di un double? Cioè facendo quel cast a puntatore a char in teoria si perderebbero informazioni su quel numero, o sbaglio?
Sì, char è più piccolo di un double certamente! Ma io devo avere un puntatore "a byte" (un char), perché devo operare sui singoli byte che compongono il double.
Nota che io non opero mai sul valore del double direttamente, cioè non faccio alcun cast sul valore del double. Mi viene passato un puntatore a double e lo faccio diventare semplicemente un puntatore a char.
Quindi non si perde nulla.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 31-05-2006, 14:41   #16
Manugal
Senior Member
 
L'Avatar di Manugal
 
Iscritto dal: Jan 2001
Città: Villanova di Guidonia (RM)
Messaggi: 1079
Perfetto, grazie ancora andbin.
Manugal è offline   Rispondi citando il messaggio o parte di esso
Old 01-06-2006, 11:28   #17
Manugal
Senior Member
 
L'Avatar di Manugal
 
Iscritto dal: Jan 2001
Città: Villanova di Guidonia (RM)
Messaggi: 1079
Un'altra cosa. Questa procedura va bene anche quando devo leggere il double? Cioè a me serve che mi faccia la conversione da host byte order a network byte order e viceversa.
Manugal è offline   Rispondi citando il messaggio o parte di esso
Old 01-06-2006, 18:07   #18
Manugal
Senior Member
 
L'Avatar di Manugal
 
Iscritto dal: Jan 2001
Città: Villanova di Guidonia (RM)
Messaggi: 1079
up
Manugal è offline   Rispondi citando il messaggio o parte di esso
Old 01-06-2006, 18:13   #19
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Quote:
Originariamente inviato da Manugal
Un'altra cosa. Questa procedura va bene anche quando devo leggere il double? Cioè a me serve che mi faccia la conversione da host byte order a network byte order e viceversa.
Credo proprio di sì. Il network byte order è big-endian.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 01-06-2006, 18:47   #20
Manugal
Senior Member
 
L'Avatar di Manugal
 
Iscritto dal: Jan 2001
Città: Villanova di Guidonia (RM)
Messaggi: 1079
D'accordo ma quando vado a leggere il double da file, devo richiamare questa funzione oppure no?
Manugal è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


OPPO Find X9 Pro: il camera phone con teleobiettivo da 200MP e batteria da 7500 mAh OPPO Find X9 Pro: il camera phone con teleobiett...
DJI Romo, il robot aspirapolvere tutto trasparente DJI Romo, il robot aspirapolvere tutto trasparen...
DJI Osmo Nano: la piccola fotocamera alla prova sul campo DJI Osmo Nano: la piccola fotocamera alla prova ...
FUJIFILM X-T30 III, la nuova mirrorless compatta FUJIFILM X-T30 III, la nuova mirrorless compatta
Oracle AI World 2025: l'IA cambia tutto, a partire dai dati Oracle AI World 2025: l'IA cambia tutto, a parti...
Anche gli USA inseguono l'indipendenza: ...
TikTok: i content creator guadagneranno ...
Nothing Phone (3a) Lite disponibile, ma ...
Emissioni globali per la prima volta in ...
Bancomat lancia Eur-Bank: la stablecoin ...
NVIDIA supera i 5.000 miliardi di dollar...
I ransomware fanno meno paura: solo un'a...
Pixel 10a si mostra nei primi rendering:...
Intel Nova Lake-S: i dissipatori delle p...
1X Technologies apre i preordini per NEO...
Tesla Cybercab cambia rotta: nel taxi de...
L'industria dell'auto europea a pochi gi...
VMware tra cloud privato e nuovi modelli...
Amazon Haul lancia il colpo di genio: pr...
Windows 11: nuova versione in arrivo a i...
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: 21:51.


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