Но преобразование завершается неудачно при значении 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
Преобразовать массив символов ASCII в длинный и длинный в массив символов ⇐ JAVA
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Преобразование расширенного Ascii (>127) в стандартный Ascii (<128) в Java
Anonymous » » в форуме JAVA - 0 Ответы
- 76 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Обработка турецких/не-ascii символов в subprocess.check_output в Python
Anonymous » » в форуме Python - 0 Ответы
- 22 Просмотры
-
Последнее сообщение Anonymous
-