iOS:如何使用十进制 X NSData 和十进制 Y NSData 生成 public 键?

iOS: How to generate public key using decimal X NSData and decimal Y NSData?

我有这样的方法

+ (NSData *)getPublicKeyFromDecimalX:(NSData *)xInput decimalY:(NSData *)yInput { ... }

当我有这样的 hexX: (NSData*) 时,我知道如何生成它...

UInt8 iBytes[] = {0x04};
    
NSMutableData *allData = [[NSMutableData alloc] init];
[allData appendBytes:iBytes length:sizeof(iBytes)];
[allData appendData:xInput];
[allData appendData:yInput];

NSMutableDictionary *publicKeyOptions = [[NSMutableDictionary alloc]init];
[publicKeyOptions setValue:(__bridge id) kSecAttrKeyTypeECSECPrimeRandom forKey:(__bridge id)kSecAttrKeyType];
[publicKeyOptions setValue:(__bridge id) kSecAttrKeyClassPublic forKey:(__bridge id)kSecAttrKeyClass];
[publicKeyOptions setValue:[NSNumber numberWithInt:256] forKey:(__bridge id)kSecAttrKeySizeInBits];
[publicKeyOptions setValue:[NSNumber numberWithBool:NO] forKey:(__bridge id)kSecAttrIsPermanent];

SecKeyRef publicKeyRef = SecKeyCreateWithData((__bridge CFDataRef)allData, (__bridge CFDictionaryRef)publicKeyOptions, nil);

但我正在努力将十进制 NSData 转换为十六进制 NSData

I'm struggling to convert decimal NSData into hexadecimal NSData.

A NSData 本身既不是十进制也不是十六进制。它只是一系列字节数据。

考虑

UInt8 bytes[] = {0x2a, 0xff};
NSData *data = [NSData dataWithBytes:bytes length:sizeof(bytes)];
NSLog(@"%@", data); // {length = 2, bytes = 0x2aff}

这是 NSData0x2a 后跟 0xff

如果您声明 bytes 为十进制,则 NSData 是相同的:

UInt8 bytes[] = {42, 255};
NSData *data = [NSData dataWithBytes:bytes length:sizeof(bytes)];
NSLog(@"%@", data); // also {length = 2, bytes = 0x2aff}

有趣的是 NSData 中表示的数字不是一系列字节(即不仅仅是一系列 8 位整数),而是大于一个字节的数值(例如16 位、32 位等)在这种情况下,我们不得不担心“endianness”作为 NSData 中表示的十进制值。因此,当我们将数值存储为一系列字节时,我们希望明确字节的顺序。例如,如果我们想要一个大端 NSData 表示:

UInt16 value = 11007;
UInt16 bytes = NSSwapHostShortToBig(value);
NSData *data = [NSData dataWithBytes:&bytes length:sizeof(bytes)];
NSLog(@"%@", data); // {length = 2, bytes = 0x2aff}