#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[]
и вышеупомянутый строковый конструктор.