Я хочу реализовать random_bytes (16) в Цель С, В PHP Выходная строка выглядит примерно так:
d�g���&���$�
Я пробовал этот код для Цель С:
uint8_t randomBytes[16];
int result = SecRandomCopyBytes(kSecRandomDefault, 16, randomBytes);
NSString *iv = [NSString stringWithFormat:@"%s",randomBytes];
Но это не так PHP выход.
Пожалуйста, помогите мне.
В выводе PHP символ is используется для замены неизвестного или непредставленного символа. Чтобы напечатать вывод необработанных байтов, вам необходимо преобразовать их в читаемый формат, например, HEX или Base64. Если вы просто печатаете необработанные байты напрямую, выходные данные могут отличаться в зависимости от среды. Поэтому лучший способ сравнения между различными средами — сначала преобразовать их, а затем выполнить сравнение. Так что для HEX в PHP это можно сделать довольно легко с помощью bin2hex
$bytes = random_bytes(16);
var_dump(bin2hex($bytes));
В вашей среде iOS у вас уже есть из кода выше:
uint8_t randomBytes[16];
int result = SecRandomCopyBytes(kSecRandomDefault, 16, randomBytes);
Чтобы преобразовать этот массив байтов в строку с шестнадцатеричным представлением:
CFMutableStringRef mutableString = CFStringCreateMutable(kCFAllocatorDefault, 16);
for (CFIndex i = 0; i < 16; i++)
{
// Add a dash every four bytes, for readability. My newer PHP environment didn't have the dashes in the output so you may skip this part if yours is the same
if (i != 0 && i%4 == 0)
{
CFStringAppend(mutableString, CFSTR("-"));
}
CFStringAppendFormat(mutableString, 0, CFSTR("%02x"), randomBytes[i]);
}
//Now you can print mutableString.
//Usually when I work in the C Security Framework/Core Foundation level I stay at that level, hence the Core Foundation code (CFMutableStringRef).
//However, the question asks about Objective-C. So to get your Objective-C/Foundation NSString * object you can simply toll-free bridge
NSString *objectiveCString = [NSString stringWithString:(__bridge NSString *)mutableString];
CFRelease(mutableString);
//...
Других решений пока нет …