Zamiana dziesiętnej na binarną - analizator stanów

0

Witam serdecznie! Jestem tutaj nowy, pracuję nad analizatorem stanów i chciałbym trochę pozmieniać w programie. Mianowicie - jeśli prześlę z urządzenia sygnały badane:

0,125
1,125
2,125
3,125
4,125
5,125
6,125
7,125
8,125
9,125
10,125
11,125
12,125
13,125
14,126
15,126
16,126
17,126
18,126
19,126
20,126
...

Gdzie pierwsza liczba oznacza czas - próbkowanie do 16k słów, a druga liczba oznacza odczyt sygnałów z ośmiu kanałów (łącznie). Moje pytanie brzmi - jaką metodą utworzyć zapisanie tej drugiej liczby (po przecinku) w systemie dwójkowym? Razem z widocznymi zerami np. jeżeli to liczba 5 to 00000010 - żebym mógł zapisać to wszystko w pliku .txt.
Przesyłam fragment kodu co mi się udało zrobić, a chciałbym właśnie to zapisywać w systemie dwójkowym żeby wyraźnie było widać gdzie jest stan wysoki, a gdzie niski. Proszę o wyrozumiałość i z góry dziękuję za odpowiedzi.

   int i=0;
        for (i=0;i<rows.length;i++){
            if (rows[i].contains("Sampling: ")){
                break; //i - teraz zawiera numer wiersza z sampling rate
            }
        }

        double sampling_rate=1; //częstotliwość próbkowania w Hz
        if (rows[i].contains("1Hz")){ sampling_rate=1; } else
        if (rows[i].contains("10Hz")){ sampling_rate=10; } else
        if (rows[i].contains("100Hz")){ sampling_rate=100; } else
        if (rows[i].contains("1kHz")){ sampling_rate=1000; } else
        if (rows[i].contains("10kHz")){ sampling_rate=10000; } else
        if (rows[i].contains("100kHz")){ sampling_rate=100000; } else
        if (rows[i].contains("1MHz")){ sampling_rate=1000000; }
        
        double time_tick=1/sampling_rate;
        double sample_counter=0;

        
        for (int j=i+3;j<rows.length;j++){ //pomija linijkę trigger mode
            
            String row=rows[j].trim(); //usuwa \n\r i inne białe znaki
            //System.out.print("Trying row ("+row+") ");
            if (row.matches("\\d+,\\d+")){ //dopasowywuje wyrażenie N-cyfr przecinek N-cyfr
            //System.out.println("Got match...");
                String d[]=row.split(",");
                double sample_no=Double.valueOf(d[0]);
                int combined_byte=Integer.valueOf(d[1]); //połączone wszystkie 8 kanałów
            
                double b0=0,b1=2,b2=4,b3=6,b4=8,b5=10,b6=12,b7=14; //rozkład bajtu na bity
                if ( (combined_byte&0x01) == 0x01) { b0 = 1; }
                if ( (combined_byte&0x02) == 0x02) { b1 = 3; }
                if ( (combined_byte&0x04) == 0x04) { b2 = 5; }
                if ( (combined_byte&0x08) == 0x08) { b3 = 7; }
                if ( (combined_byte&0x10) == 0x10) { b4 = 9; }
                if ( (combined_byte&0x20) == 0x20) { b5 = 11; }
                if ( (combined_byte&0x40) == 0x40) { b6 = 13; }
                if ( (combined_byte&0x80) == 0x80) { b7 = 15; }
            
                channel1.add(sample_counter,b0); channel1.add(sample_counter+time_tick,b0);
                channel2.add(sample_counter,b1); channel2.add(sample_counter+time_tick,b1);
                channel3.add(sample_counter,b2); channel3.add(sample_counter+time_tick,b2);
                channel4.add(sample_counter,b3); channel4.add(sample_counter+time_tick,b3);
                channel5.add(sample_counter,b4); channel5.add(sample_counter+time_tick,b4);
                channel6.add(sample_counter,b5); channel6.add(sample_counter+time_tick,b5);
                channel7.add(sample_counter,b6); channel7.add(sample_counter+time_tick,b6);
                channel8.add(sample_counter,b7); channel8.add(sample_counter+time_tick,b7);
            
                sample_counter+=time_tick;
            } //end of if (rows[j].matches("\\d+,\\d+"))
        }
1

Możesz użyć bibliotekę Guava?

import com.google.common.base.*;
...
private String IntToBinaryString(int value)
{
    return Strings.padStart(Integer.toBinaryString(value),8,'0');
}

Kod wstawiaj w znaczniki <code class="java"></code>.

0

Nie prowadź dyskusji w komentarzach.
Musisz dokładnie napisać co chcesz zrobić z częścią ułamkową (po przecinku). W pierwszym poście jest przykład: 5 => 00000010 , ale on jest błędny. Jeśli 5 jest liczbą całkowitą, to zapis dwójkowy wygląda tak: 00000101, jeśli 5 jest częścią ułamkową pewnej liczby, np. 4,5 to zapis dwójkowy wygląda tak: 10,10000000.

0

Faktycznie zrobiłem babola podając przykład.. chodziło mi o liczbę 2 :p
Głównie chodzi mi o zapis wyrażenia:

0,125 
1,125 
2,125 
3,126 
...

na zapis, który pozwoli od razu zauważyć gdzie na jakim kanale jest stan niski, a gdzie wysoki:

1,01111101
2,01111101
3,01111110
...

gdzie w wyrażeniu - a,b:
a - czas (tego nie zmieniamy)
b - liczba, którą chcę zamienić na dwójkową

Nie ma tu żadnych części ułamkowych.

1

To w czym problem? Odczytujesz jako String.

String line = cośTam.readLine();
String[] items = line.split(",");
cośTamInnego.write(items[0] + "," + String.format("%8s", Integer.toBinaryString(Integer.parseInt(items[1])).replace(" ", "0")) +"\n");
0

Kombinuje i nie wiem jak to do mnie "wtrynić"..
Mam czytanie znaków z portu w głównym programie - stąd mi wszystko przychodzi ale nie wiem jak umieścić powyższego Stringa od Ciebie bogdans - czy dać go tutaj czy w programie, który przesłałem na początku wątku?

public void serialEvent(SerialPortEvent spe) {
        if (spe.isRXCHAR()){ //przyszedł znak na port szeregowy
            int byte_count = spe.getEventValue();
            try {
                String line = serialPort.readString();
                if (line!=null) {
                    jTextArea1.append(line);
                    
                    if (jTextArea1.getText().contains("complete")){ //koniec transmisji, można rysować wykres
                        graph(lc.getDataset(jTextArea1.getText()));
                    }
                    
                }
            } catch (Exception ex) { ex.printStackTrace(); }
        }
        
    }

Shalom jeśli chodzi o zamianę na inta przez

Integer.valueOf()

to chodzi o coś takiego?

int items[1]=Integer.valueOf(items[1]);

Czy jakoś inaczej definiujemy?

1
ArrayList<String> lines = new ArrayList<String>();
public void serialEvent(SerialPortEvent spe) {
        if (spe.isRXCHAR()){ //przyszedł znak na port szeregowy
            int byte_count = spe.getEventValue();
            try {
                String line = serialPort.readString();
                //<----- tutaj jeśli będziesz od razu zapisywał do pliku, jeśli nie będziesz od razu pisał, to wystarczy tutaj zapamiętać
                lines.add(line);
                if (line!=null) {
                    jTextArea1.append(line);
 
                    if (jTextArea1.getText().contains("complete")){ //koniec transmisji, można rysować wykres
                        graph(lc.getDataset(jTextArea1.getText()));
                    }
 
                }
            } catch (Exception ex) { ex.printStackTrace(); }
        }
 
    }

Komentarz @Shalom`a jest już nieaktualny. Przeczytaj mój komentarz.

0

Chciałbym zrobić od razu zapisywanie/odczytywanie do/z pliku właśnie w tym miejscu. Będzie coś takiego?

String line = serialPort.readString();     
                    String[] items = line.split(",");
                    cośTamInnego.write(items[0] + "," + String.format("%8s", Integer.toBinaryString(Integer.parseInt(items[1])).replace(" ", "0")) +"\n");
                lines.add(line);
                if (line!=null) {
                    jTextArea1.append(line);
 
                    if (jTextArea1.getText().contains("complete")){ //koniec transmisji, można rysować wykres
                        graph(lc.getDataset(jTextArea1.getText()));
                    }

"cośTamInnego" - stworzyć klasę?

1

cośTamInnego to obiekt jakieś klasy zapisującej, np.

FileWriter fw = new FileWriter(nazwaPliku);
//lub jeśli chcesz dopisywać
FileWriter fw = new FileWriter(nazwaPliku,true);
...
fw.write(items[0] + "," + String.format("%8s", Integer.toBinaryString(Integer.parseInt(items[1])).replace(" ", "0")) +"\n");
...
fw.close();

1 użytkowników online, w tym zalogowanych: 0, gości: 1