Visualizzazione dei risultati da 1 a 9 su 9
  1. #1

    Byte Shifting e Maschere Booleane

    hola

    ho un problemuccio, ovvero

    io ho 2 gruppi di 2 byte e devo estrarre da questi 4 byte raggruppati in 2 gruppi, una serie di valori

    per la precisione dal primo gruppo devo tirar fuori Giorno, Mese e anno e dal secondo gruppo devo prendere secondi, minuti e ore

    Il problema e che non riesco a generare le maschere booleane corrette e/o a fare il byte shifting corretto per tirar fuori i dati

    ora ... prendiamo in considerazione la Data, quindi i primi 2 byte, i dati sono inseriti in questo modo:
    Bit da 0 a 4 -> Giorno
    Bit da 5 a 8 -> Mese
    Bit da 9 a 15 -> Anno

    Ora io ho seguito questo approccio:
    - ho convertito la coppia di byte in uno short
    - ho applicato le varie maschere booleane/byte shifting per estrarre i 3 valori

    il risultato è stato che non è servito a una mazza perché l'ho fatto sbagliato

    ora ... per esempio ... mettiamo l'anno ... a me interessa tirar fuori gli ultimi 7 byte

    Siccome il valore è contenuto negli ultimi byte, nel little endian, la maschera booleana la devo applicare partendo io dalle prime cifre

    Bit da 0 a 6 -> Anno
    Bit da 7 a 10 -> Mese
    Bit da 11 a 15 -> Giorno

    il problema è che non va :ARGH:

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,465
    Allora, le operazioni da fare sull'unsigned short sono

    0x001F senza shift

    0x01E0 shiftando a destra di 5 bit

    0xFE00 shiftando a destra di 9 bit

    Se fai qualche esempio pratico, facciamo due calcoli ...

  3. #3
    grazie, funzionano

    però vediamo se ho capito bene

    001F innanzi tutto annulla l'ultimo byte, dopo di che 1F = la prima parte annulla i primi 3 byte (la prima parte dell'esa decimale rappresenta la parte alta del byte, ovvero i primi 4 bit, giusto? e siccome 1 corrisponde a 0001, annullo i primi 3) e con F, che è tutto 1111, mantengo la seconda parte del byte

    giusto?

    senti, dove posso trovare qualche programmino da due soldi che mi permetta di creare le maschere? ovvero che mi permetta di inserire un valore esadecimale e mi stampi l'elenco dei bit?

    dankishen tantissimo!!!!


  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,465
    Forse quando dici

    "... la prima parte annulla i primi 3 byte ..."

    fai confusione tra byte e bit ...

    In ogni caso programmi del genere non ne conosco, ma mi sembra abbastanza semplice farne uno ... Se trovo il tempo ... Comunque sono del parere che "a mano" e' piu' sbrigativo ...

    Avevi detto, per il giorno bit da 0 a 4 ... se numeri i bit da 00 a 15 e metti a 1 quelli da 00 a 04, ottieni (raggruppandoli a 4 a 4 per convertire facilmente in esadecimale)

    1111 1100 0000 0000
    5432 1098 7654 3210

    0000 0000 0001 1111

    0 0 1 F

    per il mese

    1111 1100 0000 0000
    5432 1098 7654 3210

    0000 0001 1110 0000

    0 1 E 0

    per l'anno

    1111 1100 0000 0000
    5432 1098 7654 3210

    1111 1110 0000 0000

    F E 0 0

  5. #5
    Perchè non usi la calcolatrice di Windows in modalità scientifica ?

  6. #6
    Originariamente inviato da oregon
    Forse quando dici

    "... la prima parte annulla i primi 3 byte ..."

    fai confusione tra byte e bit ...
    si scusa, lapsus

    volevo dire bit non byte

    In ogni caso programmi del genere non ne conosco, ma mi sembra abbastanza semplice farne uno ... Se trovo il tempo ... Comunque sono del parere che "a mano" e' piu' sbrigativo ...

    Avevi detto, per il giorno bit da 0 a 4 ... se numeri i bit da 00 a 15 e metti a 1 quelli da 00 a 04, ottieni (raggruppandoli a 4 a 4 per convertire facilmente in esadecimale)

    1111 1100 0000 0000
    5432 1098 7654 3210

    0000 0000 0001 1111

    0 0 1 F

    per il mese

    1111 1100 0000 0000
    5432 1098 7654 3210

    0000 0001 1110 0000

    0 1 E 0

    per l'anno

    1111 1100 0000 0000
    5432 1098 7654 3210

    1111 1110 0000 0000

    F E 0 0
    perfetto il problema è

    come
    1111 1100 0000 0000

    lo faccio diventare

    FE00?

    nel senso, il calcolo lo devo fare per forza a mano oppure c'è un convertitore da sequenza di bit a esadecimale e viceversa?

    ti spiego ... sto completando un software per leggere e scrivere la FAT16/32 (e poi l'ntfs) tramite uno strato di librerie scritto in C# (un VFS in pratica in C#)

    solo che mi ero perso con le date

    il byte shifting (o è bit shitfing?) e le maschere booleane non sono molto usate in C# e in C le ho usate pochissimo quindi li che la cosa era leggermente più complessa mi sono perso :P

    @fastcoder:
    la calcolatrice scentifica di windows non ti da questa possibilità, ovvero di convertire da/a bit

  7. #7
    Strano...lo faccio sempre proprio per le maschere:
    - scelgo visualizzazione Hex e scrivo 5E
    - scelgo visualizzazione Bin e ottengo 1011110
    - scelgo visualizzazione Bin e scrivo 10001101
    - scelgo visualizzazione Hex e ottengo 8D
    inoltre posso scegliere se considerare Byte, Word, DWord e QWord.
    infine posso fare And/Or/Xor/Shift (purtroppo solo a sinistra, ma per lo shift a destra posso dividere per 2), etc..

    Magari però non ho capito cosa volevi

  8. #8
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,465
    Originariamente inviato da daniele_dll
    si scusa, lapsus

    volevo dire bit non byte
    Ok ... ma attenzione perche' i termini corretti sono fondamentali ...

    Originariamente inviato da daniele_dll
    perfetto il problema è

    come
    1111 1110 0000 0000

    lo faccio diventare

    FE00?
    Ho suddiviso i 16 bit in gruppi di 4 appositamente. Una cifra esadecimale equivale a 4 bit.
    Se consideri che i "pesi" dei 4 bit sono

    8 4 2 1

    e sommi quelli in cui il bit e' a 1, ottieni al volo il risultato.
    Nel caso di 1111 devi sommare 8+4+2+1 = 15 che equivale a F
    Nel caso di 1110 devi sommare 8+4+2 = 14 che equivale a E

    Se usi la tabellina (che in genere si impara a memoria ...)

    0000 = 0
    0001 = 1
    0010 = 2
    0011 = 3
    0100 = 4
    0101 = 5
    0110 = 6
    0111 = 7
    1000 = 8
    1001 = 9
    1010 = A
    1011 = B
    1100 = C
    1101 = D
    1110 = E
    1111 = F

    Con la calcolatrice puoi scrivere il valore in Hex

    FE00

    e poi usare il bottone Bin per convertirlo.

  9. #9
    @fastcoder & oregon:

    pardon, sono idiota io

    non avevo mai fatto caso al bottoncino Bin in modalità scientifica :argh:

    [ot]
    vabbe; non ci fate caso, questo è quello che succede quando si lavora senza tregua
    [/ot]

    grazie parecchio comunque!

    nota: avevo provato a fare il calcolo cosi come hai scritto tu nel post ma io di matematica sono zero e mi ero confuso

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 © 2024 vBulletin Solutions, Inc. All rights reserved.