konto usunięte

Temat: Piszę aplikację sieciową, i potrzebuję uint8, octet itp....

Witam,

W ramach zajęć na UW mam za zadanie napisać aplikację posługującą się zadanym protokołem sieciowym. Problem polega na tym, że protokół ten był projektowany wyraźnie z myślą o implementacji w C/C++, i często polega na typach unsigned.

Potrzebuję biblioteki, która pozwoli mi tłumaczyć int'y na uint8, a następnie uint8 na ciąg bajtów (a właściwie - pojedynczy bajt), bym mógł je przesłać przez sieć przez standardowe strumienie. Potrzebuję też funkcji która pozwoli mi odzyskać typ uint8 po drugiej stronie, i wyciągnąć z niego pierwotnie przesłanego int'a. Zadbam o to, by był z przedziału 0..255.
Potrzebuję również typów uint16 i (co gorsza) uint32.

Potrzebuję też czegoś, co pozwoli mi tłumaczyć typ String na ciąg octetów, ze stratą informacji o długości typu (interesują mnie wyłącznie znaki), również po to, by przesłać je przez stream. Protokół wymaga ode mnie przesyłania informacji o długości łańcucha w innym miejscu pakietu, potrzebuję więc postaci "surowej", jak w C.

Próbowałem z "org.javolution.io.struct", ale nie byłem w stanie przesłać wiadomości postaci:

{
uint8 len;
octet[len] word;
}

Proszę o pomoc :)

Pozdrawiam,
akuda

konto usunięte

Temat: Piszę aplikację sieciową, i potrzebuję uint8, octet itp....

Mam nadzieję, że poniższy kod będzie pomocny. Wszystkie większe zmienne należy traktować analogicznie.

public class UIntTest {

public static void main(String[] args) {
short back;
byte val;
for (short larger = 0; larger<256; larger++) {
val=(byte) larger;
back = (short) (val<0?256+val:val);
System.out.println(larger+"="+val+"="+back);
}
}
}


Różnica między signed a unsigned to najbardziej znaczący bit, jesteśmy więc w stanie w stosunkowo łatwy sposób to wszystko pozamieniać. Opakuj to sobie w jakieś utilsy, ew klasy.

W kwestii ciągu oktetów:
Long.parseLong(str, radix);
Integer.parseInt(str, radix);

Long.toHexString(val);
Dariusz Wawer edytował(a) ten post dnia 10.08.09 o godzinie 09:22

konto usunięte

Temat: Piszę aplikację sieciową, i potrzebuję uint8, octet itp....

Szczerze mówiąc nie zrozumiałem tej wskazówki o octetach. Na tę chwilę używam czegoś takiego:

public utf8string(byte[] bytes)
{
CharBuffer cb = Charset.defaultCharset().decode(ByteBuffer.wrap(bytes));
value = cb.toString();
}

public String getValue()
{
return value;
}
public byte[] toBytes()
{
return Charset.defaultCharset().encode(value).array().clone();
}

public static utf8string fromBytes(byte[] bytes)
{
return new utf8string(bytes);
}Andrzej Skalski edytował(a) ten post dnia 11.08.09 o godzinie 01:57

konto usunięte

Temat: Piszę aplikację sieciową, i potrzebuję uint8, octet itp....

W sprawie oktetów - sądziłem, że chodzi ci o zapisanie liczby w postaci szesnastkowej, zupełnie źle zrozumiałem tą część posta.

Moim zdaniem założenie, że default charset to UTF8, jest błędne. Powinieneś używać raczej Charset.forName(str).

Na dobrą sprawę nie wiem po co ci taka klasa - wystarczą dwie metody statyczne:

public class Utf8StringUtil {

public static byte[] bytesFromStr(String str){
return str.getBytes(Charset.forName("UTF-8"));
}
public static String strFromBytes(byte[] vals) {
return new String(vals, Charset.forName("UTF-8"));
}

public static void main(String[] args) {

String test = "To jest test UTFowego Stringa! ÓŁĄóżźćłę";
System.out.println(test);
System.out.println(Utf8StringUtil.bytesFromStr(test));
System.out.println(Utf8StringUtil.strFromBytes(Utf8StringUtil.bytesFromStr(test)));
}
}


Dodam jeszcze, że nazwy klas w Javie są zwykle nazywane z wielkich liter.Dariusz Wawer edytował(a) ten post dnia 11.08.09 o godzinie 16:44

konto usunięte

Temat: Piszę aplikację sieciową, i potrzebuję uint8, octet itp....

wielkie dzięki :)

Następna dyskusja:

Alfabet w Javie




Wyślij zaproszenie do