Prawdopodobnie odpowiedziano na pytanie gdzie, ale jak uzyskać wartość znakową wartości int?Konwersja strumienia int na char w java
W szczególności czytam a ze strumienia tcp, a czytniki .read() zwracają int.
Jak mogę otrzymać znak char z tego?
Prawdopodobnie odpowiedziano na pytanie gdzie, ale jak uzyskać wartość znakową wartości int?Konwersja strumienia int na char w java
W szczególności czytam a ze strumienia tcp, a czytniki .read() zwracają int.
Jak mogę otrzymać znak char z tego?
Jeśli próbujesz przekonwertować strumień na tekst, musisz wiedzieć, którego kodowania chcesz użyć. Następnie można przekazać tablicę bajtów do konstruktora String
i podać wartość Charset
lub zamiast tego użyć InputStreamReader
z odpowiednim Charset
.
Po prostu odlewanie z na char
działa tylko wtedy, gdy potrzebujesz ISO-8859-1, jeśli czytasz bajty bezpośrednio ze strumienia.
EDIT: Jeśli są już przy użyciu Reader
, a następnie rzucając wartość zwracaną read()
do char
jest właściwa droga (po sprawdzeniu czy jest -1 lub nie) ... ale to jest zwykle bardziej efektywne i wygodnie zadzwonić pod numer read(char[], int, int)
, aby przeczytać cały blok tekstu na raz. Nie zapomnij jednak sprawdzić wartości zwracanej, aby sprawdzić, ile znaków zostało przeczytanych.
Myślę, że nie o to pyta PO. Używa metody odczytu Readera: http://java.sun.com/j2se/1.4.2/docs/api/java/io/Reader.html#read() Pytanie, które zadaje to konwersja wartości zwróconej przez ta metoda w char. – Vanuan
Jeśli naprawdę korzysta z Czytnika, to z pewnością robi różnicę. Nie jest to jasne, biorąc pod uwagę, że mówi on o strumieniu i czytniku (małymi literami r) w tym samym zdaniu :(Zmieniono moją odpowiedź, aby to wyjaśnić: –
można również zawinąć 'InputStreamReader' w' BufferedReader' , jak wspomniano w javadoc http://docs.oracle.com/javase/8/docs/api/java/io/InputStreamReader.html – bvdb
Proste odlewy:
int a = 99;
char c = (char) a;
Czy jest jakiś powód, nie jest to praca dla Ciebie?
Niebezpieczna rada, jeśli strumień tekstu nie jest czystym ASCII. Zobacz odpowiedź Jona Skeeta powyżej. – sleske
Może nie działać. Ale myślę, że tak było. Typ danych char przechowuje zakodowaną wartość UTF-16. Aby rzucić char na int, musisz wykonać pewne transformacje. Ale ponieważ OP używa metody read(), która już zwraca wartość zakodowaną w UTF-16, zwykłe odlewanie powinno działać. Popraw mnie, jeśli się mylę. – Vanuan
Przepraszam, miałem na myśli "od int do char" – Vanuan
Może prosicie:
Character.toChars(65) // returns ['A']
Więcej informacji: Character.toChars(int codePoint)
konwertuje określony znak (punkt kodowy Unicode) do jego reprezentacji UTF-16 przechowywane w tablicy char. Jeśli podany punkt kodowy jest wartością BMP (podstawowa wielojzyczna płaszczyzna lub płaszczyzna 0), wynikowa tablica znaków ma tę samą wartość, co kodPoint. Jeśli określony punkt kodowy jest dodatkowym punktem kodowym, wynikowa tablica znaków ma odpowiednią zastępczą parę.
To tylko ważne jeśli ta liczba całkowita jest już punktem kodowania UTF-16, nie mamy pojęcia, czy tak jest.) –
Tak, zgadza się, ale IAE zostałoby wrzucone w tej sprawie – ATorras
@Atec: Nie, moim celem jest to, że jeśli on tylko czyta bajty ze strumienia (to nie jest jasne), a następnie c Odwracanie przez zwykłe rzutowanie lub używanie 'toChars' jest zwykle niewłaściwe. Jeśli czyta z Czytelnika, jest w porządku. –
Jest to całkowicie zależne od kodowania przychodzących danych.
to jest taka bezużyteczna "odpowiedź", głosowałbym w dół, ale to nawet nie jest tego warte. –
@Lpc_dark Ta odpowiedź jest poprawniejsza niż 90% innych odpowiedzi. Zobacz moją odpowiedź, aby uzyskać więcej informacji. – bvdb
To zależy od tego, co masz na myśli przez "przekonwertować int na char".
Jeśli chcesz po prostu rzucić wartość w int, można oddać go za pomocą typecast notację Javy:
int i = 97; // 97 is 'a' in ASCII
char c = (char) i; // c is now 'a'
Jeśli masz na myśli przekształcenie całkowitą 1 do znaku „1”, można to zrobić tak:
if (i >= 0 && i <= 9) {
char c = Character.forDigit(i, 10);
....
}
Jeśli chcesz po prostu przekonwertować int do char 5 '5': (tylko dla liczb całkowitych 0 - 9)
int i = 5;
char c = (char) ('0' + i); // c is now '5';
Nie. "0" + 5 staje się ciągiem "05". Prawa strona powinna być (char) ((int) "0") + i; – toddkaufmann
Nieprawda, ponieważ znaki nie są konwertowane na ciągi znaków w języku Java. –
+1 - wypróbowany i przetestowany, to działa! Spróbuj i przetestuj to sam, pozornie niepodobny do komentatorów tutaj ... –
Odpowiedzią na konwersję znaku char na int lub długą jest proste rzutowanie.
Na przykład: - jeśli chcesz przekonwertować znak "0" na długi.
Wykonaj proste oddanych
Char ch='0';
String convertedChar= Character.toString(ch); //Convert Char to String.
Long finalLongValue=Long.parseLong(convertedChar);
Done !!
thats DOKŁADNIE przeciwieństwo tego, co on pytał. – specializt
może nie najszybciej jednym:
//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);
To rozwiązanie działa dla rozmiaru długość całkowita = 1.
Integer input = 9; Character.valueOf((char) input.toString().charAt(0))
jeśli rozmiar> 1 musimy użyć pętli for i iterację.
Większość odpowiedzi tutaj proponuje skróty, które mogą spowodować duże problemy, jeśli nie masz pojęcia, co robisz. Jeśli chcesz wziąć skróty, to trzeba dokładnie wiedzieć, jakiego kodowania danych jest w.
Ilekroć rozmowy java o znaków w jego dokumentacji, mówi o 16-bitowych znaków.
Można użyć DataInputStream
, który ma wygodne metody. Aby uzyskać efektywność, 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()
rzeczywiście wykonać 2 read
„s i połączyć je do jednego 16-bitowego znaku.
rezerwy US-ASCII 8 bitów do kodowania 1 znak. Tabela ASCII opisuje tylko 128 możliwych znaków, więc 1 bit jest zawsze nieużywany.
Możesz po prostu wykonać rzutowanie w tym przypadku.
int input = stream.read();
if (input < 0) throw new EOFException();
char character = (char) input;
UTF-8, Latin-1, ANSI i wiele innych kodowań korzystać ze wszystkich 8-bitów. Pierwsze 7-bitowe są zgodne z tabelą ASCII i są identyczne z kodowaniem US-ASCII. Jednak ósmy bit oferuje znaki, które różnią się we wszystkich tych kodowaniach. Tutaj sprawy stają się interesujące.
Jeśli jesteś kowbojem i myślisz, że ósmy bit nie ma znaczenia (np. Nie interesują cię takie postacie jak "à, é, ç, è, ô ...), wtedy możesz uciec z prostym obsady.
jeśli jednak chcesz to zrobić profesjonalnie, należy naprawdę zawsze określić charset dowolnym momencie importu/eksportu tekstu (np gniazda, pliki ...).
Bądźmy poważni, wszystkie powyższe opcje to tanie sztuczki. Jeśli chcesz pisać elastyczne oprogramowanie, potrzebujesz do obsługi konfigurowalnego zestawu znaków do importowania/eksportowania danych.Oto ogólny rozwiązanie:
Odczyt danych stosując bufor byte[]
i przekonwertować do String
użyciu parametru charset.
byte[] buffer = new byte[1024];
int nrOfBytes = stream.read(buffer);
String result = new String(buffer, nrOfBytes, charset);
Można również użyć InputStreamReader
który może być tworzony z parametru charset.
Jeszcze jedna złota zasada: nigdy bezpośrednio nie rzucaj bajtu na postać. To zawsze błąd.
Opierając moją odpowiedź na założeniu, że użytkownik po prostu chciał literaaly przekształcić int
do char
np
Input:
int i = 5;
Output:
char c = '5'
Zostało już odpowiedział powyżej, jednak jeżeli wartość całkowitą i > 10
, następnie trzeba użyć char array
.
char[] c = String.valueOf(i).toCharArray();
int i = 7;
char number = Integer.toString(i).charAt(0);
System.out.println(number);
Nie opracowania na jakie dane są Ci wysyłanie i czytanie. Czy wysyłasz bajty binarne lub znaki Unicode? Metoda read .read() zwraca wartość int. Tak, ale zwraca odczytany znak, jako liczba całkowita z zakresu od 0 do 65535 (lub -1, ponieważ myślę, że int jest używane zamiast char). Może po prostu użycie 'public int read (char [] cbuf)' rozwiąże problem? – Vanuan
Odpowiedzi na to pytanie nie działają dla JSP Java. Jeśli używasz jsp, zobacz ten błąd przepełnienia stosu: http://stackoverflow.com/questions/4621836/how-to-convert-int-to-char-in-jsp-expression-language – NuclearPeon
Myślę, że to jest poprawne pytanie. Jedną z trudności związanych z przekształcaniem liczby całkowitej na znak jest przetwarzanie wartości ujemnych i wartości> = 255. – bvdb