Na to prawdopodobnie udzielono odpowiedzi gdzie indziej, ale jak uzyskać wartość znaku wartości int?
W szczególności czytam ze strumienia TCP, a metoda readers .read () zwraca wartość int.
Jak mogę z tego zdobyć chara?
Na to prawdopodobnie udzielono odpowiedzi gdzie indziej, ale jak uzyskać wartość znaku wartości int?
W szczególności czytam ze strumienia TCP, a metoda readers .read () zwraca wartość int.
Jak mogę z tego zdobyć chara?
Odpowiedzi:
Jeśli próbujesz przekonwertować strumień na tekst, musisz wiedzieć, jakiego kodowania chcesz użyć. Następnie możesz przekazać tablicę bajtów do Stringkonstruktora i podać a Charsetlub użyć zamiast tego InputStreamReaderodpowiedniego Charset.
Po prostu rzutowanie z intdo chardziała tylko wtedy, gdy chcesz ISO-8859-1, jeśli bezpośrednio czytasz bajty ze strumienia.
EDIT: Jeśli są już za pomocą Reader, a następnie rzucając wartość zwracaną read()na charto właściwa droga (po sprawdzeniu czy jest -1 lub nie) ... ale to jest zwykle bardziej wydajne i wygodne zadzwonić read(char[], int, int), aby przeczytać cały blok tekst na raz. Nie zapomnij jednak sprawdzić zwracanej wartości, aby zobaczyć, ile znaków zostało odczytanych.
InputStreamReaderw a BufferedReader, jak wspomniano w dokumentacji javadoc docs.oracle.com/javase/8/docs/api/java/io/…
Może prosisz o:
Character.toChars(65) // returns ['A']
Więcej informacji: Character.toChars(int codePoint)
Konwertuje określony znak (punkt kodowy Unicode) na jego reprezentację w formacie UTF-16 przechowywaną w tablicy char. Jeśli określony punkt kodowy jest wartością BMP (Basic Multilingual Plane lub Plane 0), wynikowa tablica znaków ma taką samą wartość jak codePoint. Jeśli określony punkt kodowy jest dodatkowym punktem kodowym, wynikowa tablica znaków ma odpowiednią parę zastępczą.
toCharsjest zwykle niewłaściwa. Jeśli czyta od Czytelnika, to w porządku.
To zależy od tego, co masz na myśli, mówiąc „zamień int na znak”.
Jeśli chcesz po prostu rzutować wartość w int, możesz ją przesłać za pomocą notacji typecast Java:
int i = 97; // 97 is 'a' in ASCII
char c = (char) i; // c is now 'a'
Jeśli masz na myśli przekształcenie liczby całkowitej 1 w znak „1”, możesz to zrobić w następujący sposób:
if (i >= 0 && i <= 9) {
char c = Character.forDigit(i, 10);
....
}
Jeśli chcesz po prostu przekonwertować int 5 na char '5': (Tylko dla liczb całkowitych 0 - 9)
int i = 5;
char c = (char) ('0' + i); // c is now '5';
Proste odlewanie:
int a = 99;
char c = (char) a;
Czy jest jakiś powód, dla którego to nie działa?
Większość odpowiedzi przedstawia tutaj skróty, które mogą przynieść duże problemy, jeśli nie masz pojęcia, co robisz. Jeśli chcesz iść na skróty, musisz dokładnie wiedzieć, w jakim kodowaniu są Twoje dane.
Ilekroć java mówi o znakach w swojej dokumentacji, mówi o znakach 16-bitowych.
Możesz użyć DataInputStream, który ma wygodne metody. Aby uzyskać wydajność, zawiń go w BufferedReader.
// e.g. for sockets
DataInputStream in = new DataInputStream(new BufferedInputStream(socket.getInputStream()));
char character = readChar(); // no need to cast
Chodzi o to, że każdy readChar()faktycznie wykona 2 readi połączy je w jeden 16-bitowy znak.
US-ASCII rezerwuje 8 bitów do zakodowania 1 znaku. Tabela ASCII opisuje jednak tylko 128 możliwych znaków, więc 1 bit jest zawsze nieużywany.
W takim przypadku możesz po prostu wykonać rzut.
int input = stream.read();
if (input < 0) throw new EOFException();
char character = (char) input;
UTF-8, Latin-1, ANSI i wiele innych kodowań wykorzystuje wszystkie 8-bitowe. Pierwsze 7 bitów jest zgodne z tabelą ASCII i jest identyczne z kodowaniem US-ASCII. Jednak ósmy bit oferuje znaki, które są różne we wszystkich tych kodowaniach. Więc tutaj robi się ciekawie.
Jeśli jesteś kowbojem i uważasz, że ósmy bit nie ma znaczenia (tj. Nie przejmujesz się postaciami typu „à, é, ç, è, ô…), możesz uciec z prostą obsadą.
Jeśli jednak chcesz to zrobić profesjonalnie, powinieneś ZAWSZE określić zestaw znaków za każdym razem, gdy importujesz / eksportujesz tekst (np. Gniazda, pliki ...).
Bądźmy poważni. Wszystkie powyższe opcje to tanie sztuczki. Jeśli chcesz pisać elastyczne oprogramowanie, musisz obsługiwać konfigurowalny zestaw znaków do importowania / eksportowania danych. Oto ogólne rozwiązanie:
Odczytaj dane używając byte[]bufora i przekonwertuj je na String parametr charset .
byte[] buffer = new byte[1024];
int nrOfBytes = stream.read(buffer);
String result = new String(buffer, nrOfBytes, charset);
Możesz także użyć, InputStreamReaderktórego instancję można utworzyć za pomocą parametru charset.
Jeszcze jedna złota zasada: nigdy nie rzucaj bajtu bezpośrednio na postać. To zawsze błąd.
Opierając moją odpowiedź na założeniu, że użytkownik po prostu chciał literaaly Konwersja intdo char, na przykład
Input:
int i = 5;
Output:
char c = '5'
Na to już odpowiedziano powyżej, jednak jeśli wartość całkowita i > 10, należy użyć char array.
char[] c = String.valueOf(i).toCharArray();
int i = 7;
char number = Integer.toString(i).charAt(0);
System.out.println(number);
Jest to całkowicie zależne od kodowania przychodzących danych.
może nie najszybszy:
//for example there is an integer with the value of 5:
int i = 5;
//getting the char '5' out of it:
char c = String.format("%s",i).charAt(0);
Odpowiedzią na konwersję char na int lub long jest proste rzucanie.
Na przykład: - jeśli chcesz zamienić znak '0' na długi.
Postępuj zgodnie z prostą obsadą
Char ch='0';
String convertedChar= Character.toString(ch); //Convert Char to String.
Long finalLongValue=Long.parseLong(convertedChar);
Gotowe!!
public int read(char[] cbuf)rozwiąże problem?