Представление символа как байт в Java

Вы хотите одну строку для каждого значения AID + OCD, поэтому вам нужно что-то вроде:

WITH main AS
(
    <complex query that returns main table>
)
SELECT *
FROM main
WHERE DELMN = (SELECT MIN(DELMN) 
               FROM main AS b 
               WHERE b.OCD=main.OCD AND b.AID = main.AID)
GROUP BY AID, OCD

Это не будет очень эффективный запрос, но должен работать. Это может быть более эффективным, присоединяясь к запросу, который вытягивает минимальную группу DELMN на AID и OCD (вместо использования подвыбора, который выполняется для каждой строки). Таким образом, нужно только один раз отсканировать эти таблицы. Не беспокойтесь об этом, если у вас много строк, что замедляет его.

24
задан Jon Skeet 30 March 2009 в 22:47
поделиться

4 ответа

Для преобразования символов в байты необходимо указать кодировку символов. Некоторые кодировки символов используют один байт за символ, в то время как другие используют два или больше байта. На самом деле, для многих языков, существует слишком много символов для кодирования единственным байтом.

В Java самый простой способ преобразовать от символов до байтов с String класс getBytes(Charset) метод. ( StandardCharsets класс определяет некоторую общую кодировку.) Однако этот метод тихо заменит символы �, если символ не может быть отображен при указанном кодировании. При необходимости в большем количестве управления можно настроить a CharsetEncoder обработать этот случай с ошибкой или использовать другой символ замены.

35
ответ дан 28 November 2019 в 23:21
поделиться

Символ - действительно 16 битов в Java (и также единственный неподписанный тип!!).

Если Вы уверены, что кодированием Ваших символов является ASCII, то можно просто выбросить их на байте (так как ASCII использует только более низкие 7 битов символа).

Если Вы не должны изменить символы или понять их значение в Строке, можно просто сохранить символы на двух байтах, как:

char[] c = ...;
byte[] b = new byte[c.length*2];
for(int i=0; i<c.length; i++) {
    b[2*i] = (byte) (c[i]&0xFF00)>>8; 
    b[2*i+1] = (byte) (c[i]&0x00FF); 
}

(Может быть желательно заменить 2* сдвигом вправо, если скорость имеет значение).

Обратите внимание однако, что некоторые фактические (отображенные) символы (или, более точно, кодовые точки Unicode) записаны на двух последовательных символах. Так вырезание между двумя символами не гарантирует, что Вы сокращаете между фактическими символами.

Если необходимо декодировать/кодировать или иначе управлять массивом символов Осведомленным о строке способом, необходимо скорее попытаться декодировать и закодировать массив символов или Строку с помощью java.io инструментов, которые гарантируют надлежащее символьное управление.

8
ответ дан 28 November 2019 в 23:21
поделиться

Для расширения, что говорят другие, если у Вас есть символ, в котором Вы нуждаетесь как массив байтов, затем Вы сначала создаете Строку, содержащую тот символ, и затем получаете массив байтов от Строки:

private byte[] charToBytes(final char x) {
  String temp = new String(new char[] {x});
  try {
    return temp.getBytes("ISO-8859-1");
  } catch (UnsupportedEncodingException e) {
    // Log a complaint
    return null;
  }
}

Конечно, используйте соответствующий набор символов. Намного более эффективный, что это должно было бы начать работать со Строками, а не взять символ за один раз, преобразовать в Строку, затем преобразовать в массив байтов.

4
ответ дан 28 November 2019 в 23:21
поделиться

символ в Java является неподписанными 16 битовыми значениями. Если то, что Вы имеете, поместится в 7 битов, затем просто делают бросок к байту (например, ASCII будет соответствовать).

Вы могли контроль java.nio.charset API также.

0
ответ дан 28 November 2019 в 23:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: