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

    Letture ripetute e operare sui bit

    Ciao a tutti e grazie sempre per la disponibilità

    Avrei due domande in un certo senso quasi collegate:


    1)Mi si presenta la necessità di leggere su una memoria (sempre la solita) una serie di informazioni eterogenee ripetute
    sempre tramite un metodo che memorizza il tutto in un array di byte (readbuffer)

    Esempio:

    usa stringa esadecimale del genere :

    00 15 41 4C 45 53 53 41 4E 44 52 4F .... che rappresenta (21) codice utente (ALESSANDRO) nome utente ...data di nascita
    ecc ecc

    queste informazioni si ripetono per 165 utenti ...

    vorrei evitare di mandare in lettura sulla memoria 165 volte (utenti) per cui la domanda è:

    esiste qualche alternativa che mi permette, dopo aver letto tutta la memoria una sola volta e memorizzata nel readbuffer
    di poter poi estrapolare le informazioni per ogni utente ad esempio ho letto (DataInputStream) puo' fare al mio caso???


    2) La seconda domanda è:
    Una di queste informazioni è memorizzata con una particolare combinazione di bit che poi letti tutti insieme mi determinano una
    rappresentazione esadecimale ad esempio:



    75 (esadecimale) = 1110101 ... io dovrei utilizzare solo alcuni di questi bit

    esistono metodi che permettono di lavorare sui bit ... a parte shif e bitwise ...


    grazie a tutti per la cortesia

  2. #2
    Rispondo alla seconda domanda.
    Solitamente, se vuoi considerare solo parte dei bit, usi le maschere di bit.
    Ad esempio, per prendere solo i primi 3 bit significativi di 0x75:

    codice:
    package desktop;
    
    public class Main
    {
        public static void print(String s, int r)
        {
            for(int i = 0; i < r; i++)
                System.out.print(s);
            System.out.println();
        }
    
        public static void f(int x, int mask)
        {
            int y = x & mask;
            
            System.out.println(Integer.toBinaryString(y));
            System.out.println(y);
        }
    
        public static void main(String[] args)
        {
            int x = 0x75;
            int mask = 0x70;
    
            String sx = Integer.toBinaryString(x);
            String smask = Integer.toBinaryString(mask);
    
            System.out.println(sx);
            System.out.println(smask);
            print("-", Math.max(sx.length(), smask.length()));
    
            f(x, mask);
        }
    }
    La classe Integer fornisce qualche altro metodo per manipolare bit, ma non credo facciano al tuo caso.

  3. #3
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: Letture ripetute e operare sui bit

    Originariamente inviato da SHARKSEAL
    00 15 41 4C 45 53 53 41 4E 44 52 4F .... che rappresenta (21) codice utente (ALESSANDRO) nome utente ...data di nascita
    ecc ecc

    queste informazioni si ripetono per 165 utenti ...

    vorrei evitare di mandare in lettura sulla memoria 165 volte (utenti) per cui la domanda è:

    esiste qualche alternativa che mi permette, dopo aver letto tutta la memoria una sola volta e memorizzata nel readbuffer
    di poter poi estrapolare le informazioni per ogni utente ad esempio ho letto (DataInputStream) puo' fare al mio caso???
    Hai tutto quanto in un array byte[] e vuoi estrarre gli id/nomi? Ok, non c'è alcun problema. Basta solo sapere il formato esatto. Il id avevi detto che sono 2 byte (sopra è 00 15), dei nomi come sai la lunghezza? C'è un nullo dietro? Cioè dopo 4F c'è un 00?

    Nulla ti vieta di estrarre i byte dall'array e comporre ciò che serve (ti avevo già spiegato come comporre un int dai due byte del id). E via di seguito, seguendo il formato dei dati.
    Se vuoi puoi anche farlo con DataInputStream, visto che perlomeno il id è in Big-Endian e quindi DataInputStream è appropriato per questo. Ma l'array byte[] devi prima incapsularlo in un ByteArrayInputStream e poi quest'ultimo in un DataInputStream.

    Originariamente inviato da SHARKSEAL
    75 (esadecimale) = 1110101 ... io dovrei utilizzare solo alcuni di questi bit

    esistono metodi che permettono di lavorare sui bit ... a parte shif e bitwise ...
    Ma sono questi che devi usare! .... operatori bitwise e/o shift.

    byte val = 0x75;

    Esempi:
    Vuoi testare se il bit 4 è a 1? if ((val & 0x10) != 0)
    Vuoi testare se i 4 bit alti sono 0111 (7)? if ((val & 0xF0) == 0x70)
    Vuoi estrarre i 4 bit alti come valore 0-15? int parteAlta = val >> 4 & 0x0F;
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  4. #4
    Grazie ad entrambi ... andbin stavo proprio documentandomi sul ByteArrayInputStream grazie

    provo i vostri suggerimenti a buon rendere

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.