Преобразовать массив символов ASCII в длинный и длинный в массив символовJAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Преобразовать массив символов ASCII в длинный и длинный в массив символов

Сообщение Anonymous »

Но преобразование завершается неудачно при значении 128.
public long asciiToLong(char[] in) {
CharBuffer charBuffer = CharBuffer.wrap(in);
ByteBuffer byteBuffer = StandardCharsets.US_ASCII.encode(charBuffer);

byte[] byteArray = new byte[byteBuffer.remaining()];
byteBuffer.get(byteArray);

long result = ByteBuffer.wrap(new String(byteArray).getBytes()).getLong();
return result;
}

public char[] longToAscii(long in) {
ByteBuffer buffer = ByteBuffer.allocate(Long.BYTES);
buffer.putLong(in);
byte[] b = buffer.array();
CharBuffer charBuffer = StandardCharsets.US_ASCII.decode(ByteBuffer.wrap(b));

char[] result = new char[charBuffer.remaining()];
charBuffer.get(result);

return result;
}

Когда я тестирую его с помощью следующего кода, он терпит неудачу на 128.
for (long l = 0 ; l < 100000 ; l++) {
char[] ascii = longToAscii(l);
System.out.printf("%d -> ", l);
long l2 = asciiToLong(ascii);
System.err.printf("%d\n", l2);
if (l != l2) {
throw new RuntimeException();
}
}

Вывод: 0 -> 0
1 -> 1
2 -> 2
3 -> 3
// console output truncated..
126 -> 126
127 -> 127
128 -> 63 // fails

Изменение StandardCharset, используемого для декодирования длинного целого числа, не удается в той же позиции с другим значением.

EDIT< /h5>
Наконец-то мне удалось добиться этого без использования кодировки, хотя ее, безусловно, можно оптимизировать.
public long asciiToLong(char[] in) {
long result = byteArrayToLong(charArrayToByteArray(in));
return result;
}

public char[] longToAscii(long in) {
byte[] bs = longToByteArray(in);
char[] result = new char[bs.length];
int i = bs.length;
for (byte b : bs) {
i--;
result = (char) b;
}
return result;
}

private long byteArrayToLong(byte[] b) {
long result = 0;
for (byte value : b) {
result > j);
i++;
}
return b;
}

Тестируем с помощью следующего кода
long l;
long l2;
for (l = 0 ; l < 100000 ; l++) {
char[] ascii = longToAscii(l);
System.out.printf("%d->", l);
l2 = asciiToLong(ascii);
System.out.printf("%d\n", l2);
if (l != l2) {
throw new RuntimeException();
}
}

Показывает следующий вывод без ошибок
0 -> 0
1 -> 1
2 -> 2
3 -> 3
// console output truncated..
99999 -> 99999


Подробнее здесь: https://stackoverflow.com/questions/784 ... char-array
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • ASCII Art — сортировка массива символов ASCII по уровням яркости (C/C++)
    Anonymous » » в форуме C++
    0 Ответы
    24 Просмотры
    Последнее сообщение Anonymous
  • Как преобразовать символ ASCII в его значение ASCII int?
    Anonymous » » в форуме C++
    0 Ответы
    83 Просмотры
    Последнее сообщение Anonymous
  • Преобразование расширенного Ascii (>127) в стандартный Ascii (<128) в Java
    Anonymous » » в форуме JAVA
    0 Ответы
    76 Просмотры
    Последнее сообщение Anonymous
  • C++ Печать специальных символов ascii на консоль Windows
    Гость » » в форуме C++
    0 Ответы
    58 Просмотры
    Последнее сообщение Гость
  • Обработка турецких/не-ascii символов в subprocess.check_output в Python
    Anonymous » » в форуме Python
    0 Ответы
    22 Просмотры
    Последнее сообщение Anonymous

Вернуться в «JAVA»