Преобразувайте дълга стойност в char последователност в Java

Бих искал да преобразувам дълга стойност в char последователност като в този калкулатор тук.

Наистина не знам как тази стойност се преобразува в ASCII последователността (или дали дори е правилна). Мислех, че една ASCII стойност е дълга 8 бита, така че това би означавало, че трябва да преобразувам дългата стойност в двоична и след това да я разделя на 8 битови блокове, правилно ли е?


person wasp256    schedule 07.10.2013    source източник
comment
опитвате ли се да намерите еквивалента на раздела ASCII на тази страница? какво си пробвал   -  person Martin Serrano    schedule 07.10.2013


Отговори (3)


Строго, ASCII символите са дълги 7 бита и обикновено просто добавяме допълнителен 0 в началото, за да получим 8 бита. Разширенията на ASCII (като ISO 8859) имат 8-битови дълги знаци. Калкулаторът, който сте свързали, изглежда използва едно от тези разширения.

В Java дългите имат 64 бита (и един от тези битове се използва за знак), така че наистина можете да имате 8 части от 8-битови дълги символи.

Първо, ще трябва да преобразувате своя дълъг към масив от байтове (не целият въпрос е от значение за този случай, но част от него е -- особено частта, която споменава ByteBuffer).

byte[] bytes = ByteBuffer.allocate(8).putLong(someLong).array();

След като имате масива, преобразувайте всеки байт в char, като използвате просто преобразуване.

РЕДАКТИРАНЕ: Вместо ръчно конвертиране на всеки знак, можете да използвате java.lang.String(byte[]) конструктор.

String str = new String(bytes);

Имайте предвид, че това ще използва набора от знаци по подразбиране на платформата. Ако това не е желателно, можете да използвате един от конструкторите, които също приемат набор от знаци.

person luiscubal    schedule 07.10.2013
comment
Можете просто да използвате конструктора String, който приема byte[]. - person Sotirios Delimanolis; 07.10.2013
comment
@SotiriosDelimanolis О, да, забравих за това. Това е по-лесно за използване. - person luiscubal; 07.10.2013
comment
Опитах вашия метод и досега работи добре, за съжаление все още получавам някои неразрешени знаци (показани с въпросителен знак в диамант)... какво имате предвид с you can use one of the constructors? Има ли начин да се разшири кодовият набор? - person wasp256; 07.10.2013
comment
@wasp256 Можете да приложите свои собствени набори от знаци, но тук е излишно. Вие получавате ? диаманти, ако знакът не се разпознава от набора от знаци, който използвате. Опитайте ISO 8859-1-15 и ако това не ви даде желаните резултати, можете да се върнете към използването на цикъл и ръчното създаване на знаците. - person luiscubal; 07.10.2013
comment
Извинете, но как да настроя новия ISO? - person wasp256; 07.10.2013

не Има няколко начина да направите това. Един от начините е използването на java.math.BigInteger, който има метод, наречен toByteArray(). Опитайте го, ако отговаря на вашия проблем.

person Martin Kersten    schedule 07.10.2013

Опитайте този код, за да конвертирате дълга стойност в масив от 4 знака.

//convert long to char array

long longValIn = 229902744986400000L;

ByteBuffer bb1 = ByteBuffer.allocate(8);
bb1.putLong(longValIn); 

char [] charArr = new char[4];
charArr[0] = bb1.getChar(0);
charArr[1] = bb1.getChar(2);
charArr[2] = bb1.getChar(4);
charArr[3] = bb1.getChar(6);


//convert char array to long

ByteBuffer bb2 = ByteBuffer.allocate(8);
bb2.putChar(0,charArr[0]);
bb2.putChar(2,charArr[1]);
bb2.putChar(4,charArr[2]);
bb2.putChar(6,charArr[3]);

long longValOut = bb2.getLong(0); 
person live-love    schedule 01.10.2018