Нужна помощь в преобразовании короткой подпрограммы Objective-C в Java

#java #objective-c

#java #objective-c

Вопрос:

Я не уверен, что эквивалент mutableData в Java. и функция Java для преобразования необработанных данных в строку в кодировке ASCII.

   (NSString*) encode:(const uint8_t*) input length:(NSInteger) length {
NSMutableData* data = [NSMutableData dataWithLength:((length   2) / 3) * 4];
uint8_t* output = (uint8_t*)data.mutableBytes;

return [[[NSString alloc] initWithData:data
                              encoding:NSASCIIStringEncoding] autorelease];
}
  

Комментарии:

1. Действительно ли так определяется метод? Я не вижу, чтобы input параметр где-либо использовался.

Ответ №1:

java.lang.String имеет конструктор, который принимает массив байтов и кодировку символов (вы могли бы использовать US-ASCII )

Ответ №2:

NSData и ее изменяемый вариант NSMutableData — это просто объектно-ориентированные оболочки для байтовых буферов.

В Java это обычно просто byte[] .

NSASCIIStringEncoding , если я правильно понимаю, это просто кодировка, которая преобразует 8-битную строку UTF-8 и кодирует ее в 7-битной чистой кодировке ASCII. (Что может быть преобразованием с потерями). Эквивалентом этого было бы предоставить US-ASCII в качестве кодировки конструктору для String . Я думаю, что конструктор, который вам нужен, это String(byte[] bytes, String charsetName)

Интересная вещь в том, как создается ваш NSMutableData, — это длина, которую они указывают: ((length 2) / 3) * 4 Это наводит меня на мысль, что NSASCIIStringEncoding возможно, используется кодировка Base64 для выполнения преобразования из 8-разрядного в 7-разрядное. Если это так, то преобразование в конце концов не приводит к потерям. Эквивалентом в Java было бы что-то вроде утилиты Base64 в Apache Commons.

Редактировать: Поразмыслив и после некоторого поиска, я не думаю, что NSASCIIStringEncoding используется какая-либо кодировка Base64, но что она может вводить escape-коды для символов, которые не являются 7-разрядными чистыми, и приведенная выше длина — это просто их вычисленный наихудший случай длины, которая может потребоваться, если нужно экранировать каждый символ. Поэтому я не думаю, что вам вообще понадобится библиотека apache commons: просто a byte[] и вышеупомянутый строковый конструктор.