gpt4 book ai didi

objective-c - 将非常大的十进制字符串转换为十六进制?

转载 作者:搜寻专家 更新时间:2023-10-30 20:25:26 24 4
gpt4 key购买 nike

我在 NSString 中有一个非常大的十进制数,它太大而无法放入包括 NSDecimal 在内的任何变量中。我是手动计算的,但如果我不能将数字放入变量中,那么我就无法除法它。那么转换字符串的好方法是什么?

示例输入:423723487924398723478243789243879243978234

输出:4DD361F5A772159224CE9EB0C215D2915FA

我在看第一个答案here ,但它在 C# 中,我不知道它是否等效于 Objective C。

有没有人有任何不涉及使用外部库的想法?

最佳答案

如果这就是您所需要的,那么实现起来并不难,特别是如果您愿意使用 Objective-C++。通过使用 Objective-C++,您可以使用 vector 来管理内存,从而简化代码。

这是我们要实现的接口(interface):

// NSString+BigDecimalToHex.h
@interface NSString (BigDecimalToHex)
- (NSString *)hexStringFromDecimalString;
@end

为了实现它,我们将一个任意精度的非负整数表示为一个 base-65536 数字的向量:

// NSString+BigDecimalToHex.mm
#import "NSString+BigDecimalToHex.h"
#import <vector>

// index 0 is the least significant digit
typedef std::vector<uint16_t> BigInt;

“困难”部分是将 BigInt 乘以 10 并向其添加一位小数。我们可以很容易地将其实现为带有预加载进位的长乘法:

static void insertDecimalDigit(BigInt &b, uint16_t decimalDigit) {
uint32_t carry = decimalDigit;
for (size_t i = 0; i < b.size(); ++i) {
uint32_t product = b[i] * (uint32_t)10 + carry;
b[i] = (uint16_t)product;
carry = product >> 16;
}
if (carry > 0) {
b.push_back(carry);
}
}

有了这个辅助方法,我们就可以实现接口(interface)了。首先,我们需要通过为每个十进制数字调用一次辅助方法,将十进制数字字符串转换为 BigInt:

- (NSString *)hexStringFromDecimalString {
NSUInteger length = self.length;
unichar decimalCharacters[length];
[self getCharacters:decimalCharacters range:NSMakeRange(0, length)];
BigInt b;
for (NSUInteger i = 0; i < length; ++i) {
insertDecimalDigit(b, decimalCharacters[i] - '0');
}

如果输入字符串为空或全为零,则 b 为空。我们需要检查一下:

    if (b.size() == 0) {
return @"0";
}

现在我们需要将b 转换为十六进制数字字符串。 b 的最高有效数字位于最高索引处。为避免前导零,我们将特别处理该数字:

    NSMutableString *hexString = [NSMutableString stringWithFormat:@"%X", b.back()];

然后我们将每个剩余的 base-65536 数字转换为四个十六进制数字,从最高有效位到最低有效位:

    for (ssize_t i = b.size() - 2; i >= 0; --i) {
[hexString appendFormat:@"%04X", b[i]];
}

然后我们就完成了:

    return hexString;
}

您可以找到我的完整测试程序(作为 Mac 命令行程序运行)in this gist .

关于objective-c - 将非常大的十进制字符串转换为十六进制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15395556/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com