Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2008
    Messaggi
    17

    [C] Stampare intero a 2byte da un array di bytes

    Ciao a tutti,ho un'applicazione che mi manda un messaggio cosi composto (vi indico all'interno dell'array le posizioni occupate da ogni dato) tramite stream TCP:

    msg[0]: un char (che non mi interessa)

    msg[1-4]: un int che vorrei stampare

    msg[5-6]: uno short int che vorrei stampare

    Per ora riesco sempre e solo a stampare la prima posizione di questi dati, percio' per puro caso l'int in posizione 1-4 (essendo in littleendian)
    mi viene stampato correttamente (e' infatti un intero <9).

    Come faccio a far capire al programma che il dato che voglio stampare occupa piu' di una posizione nell'array?
    Ho provato cosi, ma ancora non ottengo il risultato sperato:

    codice:
    uint16_t res;
    uint8_t tmp, tmp2;
    tmp=65;
    tmp2=31;
    res = res | tmp2;
    res = res >> 8;
    res = res | tmp;
    printf (" res = %d \n", res);
    sono riuscito a risolvere il problema di mettere in un unica variabile a 16 bit il contenuto di due posizioni del mio array, ora pero' non riesco a stampare la mia variabile a 16 bit, me ne stampa solo 8.
    La printf() mi stampa il valore 65 (cioe' tmp), quando io vorrei che stampasse tutti e 16 i bit (cioe' il valore 8001).

    Non riesco a capire dove sbaglio, qualcuno sa indicarmi il problema ?

    Grazie in anticipo.

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Domanda... perchè non utilizzare una struct?
    codice:
    struct tuaStruttura {
       char ch;
       int intero;
       short int piccolo;
    };
    A questo punto prendi il tuo array e lo manipoli come se fosse una variabile di tipo "tuaStruttura":
    codice:
    tuaStruttura tmp = (tuaStruttura) msg;
    
    printf("Char che non ti interessa: %c\n", tmp.ch);
    printf("Intero su 4 byte: %d\n", tmp.intero);
    printf("Intero corto su 2 byte: %d\n", tmp.piccolo);
    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    Utente di HTML.it
    Registrato dal
    Jun 2008
    Messaggi
    17
    Originariamente inviato da LeleFT
    Domanda... perchè non utilizzare una struct?
    codice:
    struct tuaStruttura {
       char ch;
       int intero;
       short int piccolo;
    };
    A questo punto prendi il tuo array e lo manipoli come se fosse una variabile di tipo "tuaStruttura":
    codice:
    tuaStruttura tmp = (tuaStruttura) msg;
    
    printf("Char che non ti interessa: %c\n", tmp.ch);
    printf("Intero su 4 byte: %d\n", tmp.intero);
    printf("Intero corto su 2 byte: %d\n", tmp.piccolo);
    Ciao.
    error: conversion to non-scalar type requested

  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Sorry, errore mio:
    codice:
    struct tuaStruttura *tmp = (struct tuaStruttura *) msg;
    printf("Carattere: %c\n", tmp->ch);
    printf("Intero 4 byte: %d\n", tmp->intero);
    printf("Intero 2 byte: %d\n", tmp->piccolo);
    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  5. #5
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Mi auto-correggo... non ho tenuto conto del padding.
    A questo punto ti conviene fare tutto a mano, giocando con i puntatori:
    codice:
    printf("Carattere: %c\n", msg[0]);
    printf("Intero 4 byte: %d\n", *((int *) (msg + 1)));
    printf("Intero 2 byte: %d\n", *((short int *) (msg + 5)));
    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  6. #6
    Utente di HTML.it
    Registrato dal
    Jun 2008
    Messaggi
    17
    Ciao grazie mille per la disponibilita', non riusciamo pero' a fare quello che vogliamo;
    Abbiamo questa situazione qua noi:

    nelle posizioni dell'array (array di char) ci sono memorizzati questi valori (8 bit ogni elemento).

    array[5]=65; /*(10000010 little endian)*/
    array[6]=31; /*(11111000 little endian)*/

    uint8_t tmp = array[5];
    uint8_t tmp2 = array[6];
    uint16_t res =0;

    Ora io voglio avere in res un intero a 16 bit che mi rappresenti il numero 8001 (1000001011111000) che sarebbe la concatenazione del contenuto in bit di tmp e tmp2.

    Noi facciamo questa cosa:

    res = res | tmp2; /* Dovrebbe essere cosi': 1111100000000000*/
    res = res >> 8; /* Dovrebbe essere cosi': 0000000011111000*/
    res = res | tmp; /* Dovrebbe esere cisi': 1000001011111000 = 8001*/
    printf("res = %d \n", res); /* Dovrebbe stampare 8001*/

    Purtroppo viene stampato 65 cioe' tmp, come se gli altri 8 bit restanti fossero diventati 0.

    Abbiamo provato a fare come ci hai consigliato ma ci restituisce dei valori molto strani dentro la struttura.

    Scusa per il disturbo e grazie per un eventuale risposta.

    Saluti.

  7. #7
    Domanda... perchè non utilizzare una struct?
    codice:
    struct tuaStruttura {
       char ch;
       int intero;
       short piccolo;
    };
    
    struct tuaStruttura tmp;
    
    memcpy(&tmp, msg, sizeof(struct tuaStruttura));
    
    printf("Char che non ti interessa: %c\n", tmp.ch);
    printf("Intero su 4 byte: %d\n", tmp.intero);
    printf("Intero corto su 2 byte: %d\n", tmp.piccolo);


  8. #8
    Utente di HTML.it
    Registrato dal
    Jun 2008
    Messaggi
    17
    Lascia stare il post chilometrico dopo la tua auto-correzione sul padding, ha risolto il problema il giocherellare con i puntatori.

    Ti ringrazio per l'aiuto ero veramente in difficolta' (noob ftw QQ).

    Saluti.

  9. #9
    Originariamente inviato da vv1984
    Ciao grazie mille per la disponibilita', non riusciamo pero' a fare quello che vogliamo;
    Abbiamo questa situazione qua noi:

    nelle posizioni dell'array (array di char) ci sono memorizzati questi valori (8 bit ogni elemento).

    array[5]=65; /*(10000010 little endian)*/
    array[6]=31; /*(11111000 little endian)*/

    uint8_t tmp = array[5];
    uint8_t tmp2 = array[6];
    uint16_t res =0;

    Ora io voglio avere in res un intero a 16 bit che mi rappresenti il numero 8001 (1000001011111000) che sarebbe la concatenazione del contenuto in bit di tmp e tmp2.

    Noi facciamo questa cosa:

    res = res | tmp2; /* Dovrebbe essere cosi': 1111100000000000*/
    res = res >> 8; /* Dovrebbe essere cosi': 0000000011111000*/
    res = res | tmp; /* Dovrebbe esere cisi': 1000001011111000 = 8001*/
    printf("res = %d \n", res); /* Dovrebbe stampare 8001*/

    Purtroppo viene stampato 65 cioe' tmp, come se gli altri 8 bit restanti fossero diventati 0.

    Abbiamo provato a fare come ci hai consigliato ma ci restituisce dei valori molto strani dentro la struttura.

    Scusa per il disturbo e grazie per un eventuale risposta.

    Saluti.
    codice:
    union res {
    
       uint8_t tmp[2];
       uint16_t res;
    
    };
    
    union res n;
    
    n.tmp[0] = array[5];
    n.tmp[1] = array[6];
    
    printf("%d\n", n.res);

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.