Преобразовать массив символов 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 МБ.

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