CRC #30

Closed
s426110 wants to merge 12 commits from s426110/DALGLI0:CRC into master
First-time contributor
No description provided.
Author
First-time contributor

Program uruchamia się z konsoli w sposób:

java CRC ciąg_znaków_n-2 -e //aby obliczyć FCS dla podanego ciąg

java CRC ciąg_znaków_n -d //aby sprawdzić czy ostanie suma kontrolna
jest zgodna z treścią wiadomości

> Program uruchamia się z konsoli w sposób: > > java CRC ciąg_znaków_n-2 -e //aby obliczyć FCS dla podanego ciąg > > java CRC ciąg_znaków_n -d //aby sprawdzić czy ostanie suma kontrolna > jest zgodna z treścią wiadomości
Owner
$ git checkout s426110/CRC
HEAD is now at 477d8a3 Usuń '01-Pierścień-Zn.md'
$ java CRC "Hello world!" -e
Error: Could not find or load main class CRC
Caused by: java.lang.ClassNotFoundException: CRC
```bash $ git checkout s426110/CRC HEAD is now at 477d8a3 Usuń '01-Pierścień-Zn.md' $ java CRC "Hello world!" -e Error: Could not find or load main class CRC Caused by: java.lang.ClassNotFoundException: CRC ```
Author
First-time contributor

Zapomniałem dodać, że przed uruchomieniem należy skompilować kod źródłowy. Polecenie javac * powinno rozwiązać problem.

Zapomniałem dodać, że przed uruchomieniem należy skompilować kod źródłowy. Polecenie javac * powinno rozwiązać problem.
Owner
$ java CRC "Hello world!" -e
Hello world!½"
$ java CRC "Hello world!½"" -d
bash: !½: event not found

Problem jest oczywiście w tym, że próbuje Pan zakodować znaki które nie należą do ASCII przy pomocy jakiegoś kodowania. Prawidłowym outputem powinna być bytesarray (lub jego odpowiednik w javie), ponieważ tutaj pierwszy znak fcs nie mieści się w kodowaniu ASCII. Proszę zobaczyć uaktualnioną wersję zadania.

```bash $ java CRC "Hello world!" -e Hello world!½" $ java CRC "Hello world!½"" -d bash: !½: event not found ``` Problem jest oczywiście w tym, że próbuje Pan zakodować znaki które nie należą do ASCII przy pomocy jakiegoś kodowania. Prawidłowym outputem powinna być `bytesarray` (lub jego odpowiednik w javie), ponieważ tutaj pierwszy znak fcs nie mieści się w kodowaniu ASCII. Proszę zobaczyć uaktualnioną wersję zadania.
Author
First-time contributor

Znaki kodowane są do extended ASCII (używane jest 8 zamiast 7 bitów). Problem przy dekodowaniu tego konkretnego przykładu polega na tym, że bash odczytuje jako drugi bajt jako oznaczenie końca ciągu znaków. Powyższy przykład powinien zadziałać jeżeli zamienione zostaną znaki cudzysłowów (") na apostrofy (').

Znaki kodowane są do extended ASCII (używane jest 8 zamiast 7 bitów). Problem przy dekodowaniu tego konkretnego przykładu polega na tym, że bash odczytuje jako drugi bajt jako oznaczenie końca ciągu znaków. Powyższy przykład powinien zadziałać jeżeli zamienione zostaną znaki cudzysłowów (") na apostrofy (').
Owner

nie ma czegoś takiego jak "extended ascii" ;-) są różne kodowania pozostałych ~127 znaków; np iso8859 albo 1250

co jest tylko dyskusją z boku prawdziwego problemu, że program powinien działać niezależnie od kodowania i powłoki.

nie ma czegoś takiego jak "extended ascii" ;-) są różne kodowania pozostałych ~127 znaków; np iso8859 albo 1250 co jest tylko dyskusją z boku prawdziwego problemu, że program powinien działać niezależnie od kodowania i powłoki.
Author
First-time contributor

Uważam, że mój program działa niezależnie od powłoki (w tym konkretnym przypadku jestem przekonany, że zadziała jeżeli użyje się 'sztuczki' z apostrofami), a co do kodowania to w jaki sposób mają być interpretowane wartości bajtów powyżej 127 skoro nie da się ich zapisać w ASCII?

Uważam, że mój program działa niezależnie od powłoki (w tym konkretnym przypadku jestem przekonany, że zadziała jeżeli użyje się 'sztuczki' z apostrofami), a co do kodowania to w jaki sposób mają być interpretowane wartości bajtów powyżej 127 skoro nie da się ich zapisać w ASCII?
Owner

Proszę w takim razie sprawić, żeby Pana program był w stanie zweryfikować, czy fcs [0x27, 0x22] jest właściwy dla wiadomości Hello world! (oba znaki to ascii)

Proszę również się zastanowić w jakiej formie pojawi się wynik na ekranie (i czy będzie można go zweryfikować), jeśli pierwszym bajtem będzie 0x08.

Wreszcie to, że nie da się wyinterpretować liczb w ascii nie przeszkadza chyba temu, żeby ich używać? ;-) i w czytelny sposób wypisywać do konsoli. Nie trzeba po prostu przechowywać wiadomości+fcs jako stringa, wystarczy do tego tablica wartości unsigned char (8-bajtowych liczb całkowitych).

A na samym końcu: co jest czytelniejszym znakiem w konsoli: 0x7f, czy jego reprezentacja w ascii??

Proszę w takim razie sprawić, żeby Pana program był w stanie zweryfikować, czy fcs `[0x27, 0x22]` jest właściwy dla wiadomości `Hello world!` (oba znaki to ascii) Proszę również się zastanowić w jakiej formie pojawi się wynik na ekranie (i czy będzie można go zweryfikować), jeśli pierwszym bajtem będzie `0x08`. Wreszcie to, że nie da się wyinterpretować liczb w ascii nie przeszkadza chyba temu, żeby ich używać? ;-) i w czytelny sposób wypisywać do konsoli. Nie trzeba po prostu przechowywać wiadomości+fcs jako stringa, wystarczy do tego tablica wartości `unsigned char` (8-bajtowych liczb całkowitych). A na samym końcu: co jest czytelniejszym znakiem w konsoli: 0x7f, czy jego reprezentacja w ascii??
Author
First-time contributor

Poprawione. Zmodyfikowałem output tak, żeby nie było żadnych niejasności.

(1) Jeżeli na wejściu program dostanie jeden ciąg znaków, obliczy FCS i da na wyjściu 3 wartości (wiadomość, wartość pierwszego bajtu FCS, wartość drugiego bajtu FCS).

(2) Jeżeli program na wejściu dostanie 3 wartości (output z (1)) sprawdzi czy FCS zgadza się z wiadomością.

PS C:\out> java CRC "Hello world!"

Hello world! -67 34

PS C:\out> java CRC "Hello world!" -67 34

true

Poprawione. Zmodyfikowałem output tak, żeby nie było żadnych niejasności. (1) Jeżeli na wejściu program dostanie jeden ciąg znaków, obliczy FCS i da na wyjściu 3 wartości (wiadomość, wartość pierwszego bajtu FCS, wartość drugiego bajtu FCS). (2) Jeżeli program na wejściu dostanie 3 wartości (output z (1)) sprawdzi czy FCS zgadza się z wiadomością. `PS C:\out> java CRC "Hello world!"` `Hello world! -67 34` `PS C:\out> java CRC "Hello world!" -67 34` `true`
Owner

ok

ok
Owner

uwagi do kodu:

  1. Dlaczego ArrayList<Integer> g = new ArrayList<>(); ArrayList<Integer> l = new ArrayList<>(); są listami liczb całkowitych, a nie wielomianami?? gdyby mieć ładnie zaimplementowaną klasę PolynomialRing można by wówczas napisać (zmyślam oczywiście nazwy)
PolynomialRing R = PolynomialRing(2);
Polynomial x = R.variable();
Polynomial g = R.add(R.pow(x,16), R.pow(x,12), R.pow(x, 5), R.pow(x,0)); //x¹⁶ + x¹² + x⁵ + 1
Polynomial l = R.fromList([1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]) //
Polynomial m = R.fromString(message);
m =  R.mul(m, R.pow(x,16)), R.mul(R.pow(x, message.length()-16, l) // m = m*x¹⁶ + xⁿ⁻¹⁶*l
Polynomial fcs = R.mod(m, g)
return R.tobyte(fcs)

(chociaż muszę przyznać, że ta pseudo-java którą tutaj próbuję napisać się do tego naprawdę słabo nadaje. Dlaczego jednak nie Python? ;-)

  1. Spoglądając w klasę Polynomials... doprawdy wszystkie operacje wykonuje się na listach liczb całkowitych?? a może jednak (znowu pseudo-java, nigdy w tym języku nie pisałem):
public class Polynomial implements List<ModInt>{
    ArrayList<ModInt> coefficients;

    public Polynomial(ArrayList<Integer> coeffs){
        this.coeffs = coeffs;
    }
    .... // implement the interface
}

public class PolynomialRing{
    int mod;

    public Polynomial(int mod){
      this.mod = mod;
    }
    
    public Polynomial add(Polynomial f, Polynomial g){
        Polynomial result = new Polynomial();
        for (int i = 0; i < min(f.length(),g.length()), i++){
            result.set(i, f.get(i) + g.get(i));
        }
        //dodać co zostało
        return result;
    }
    // itd...
}
uwagi do kodu: 1. Dlaczego `ArrayList<Integer> g = new ArrayList<>(); ArrayList<Integer> l = new ArrayList<>();` są listami liczb całkowitych, a nie wielomianami?? gdyby mieć ładnie zaimplementowaną klasę `PolynomialRing` można by wówczas napisać (zmyślam oczywiście nazwy) ``` PolynomialRing R = PolynomialRing(2); Polynomial x = R.variable(); Polynomial g = R.add(R.pow(x,16), R.pow(x,12), R.pow(x, 5), R.pow(x,0)); //x¹⁶ + x¹² + x⁵ + 1 Polynomial l = R.fromList([1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]) // Polynomial m = R.fromString(message); m = R.mul(m, R.pow(x,16)), R.mul(R.pow(x, message.length()-16, l) // m = m*x¹⁶ + xⁿ⁻¹⁶*l Polynomial fcs = R.mod(m, g) return R.tobyte(fcs) ``` (chociaż muszę przyznać, że ta pseudo-java którą tutaj próbuję napisać się do tego naprawdę słabo nadaje. Dlaczego jednak nie Python? ;-) 2. Spoglądając w klasę `Polynomials`... doprawdy wszystkie operacje wykonuje się na listach liczb całkowitych?? a może jednak (znowu pseudo-java, nigdy w tym języku nie pisałem): ```java public class Polynomial implements List<ModInt>{ ArrayList<ModInt> coefficients; public Polynomial(ArrayList<Integer> coeffs){ this.coeffs = coeffs; } .... // implement the interface } public class PolynomialRing{ int mod; public Polynomial(int mod){ this.mod = mod; } public Polynomial add(Polynomial f, Polynomial g){ Polynomial result = new Polynomial(); for (int i = 0; i < min(f.length(),g.length()), i++){ result.set(i, f.get(i) + g.get(i)); } //dodać co zostało return result; } // itd... } ```
kalmar closed this pull request 2018-06-29 02:48:35 +02:00

Pull request closed

Sign in to join this conversation.
No reviewers
No Label
No Milestone
No Assignees
2 Participants
Notifications
Due Date
The due date is invalid or out of range. Please use the format 'yyyy-mm-dd'.

No due date set.

Dependencies

No dependencies set.

Reference: kalmar/DALGLI0#30
No description provided.