iOS64和.NET之间的Base64编码差异

时间:2014-01-10 15:12:52

标签: c# ios objective-c encoding base64

我正在开发一个50%iOS和50%Microsoft.NET C#的系统。系统中使用的主要ID是Guids / NSUUID,它们会不时地转换为Base64字符串。我对.NET和iOS如何执行base64转换存在差异。

这是我的Objective-c代码,用于将NSUUID(字符串格式)转换为Base64字符串:

+(NSString*)getBase64IdFromGuidStringWithString:(NSString*)stringInGuidFormat
{
    NSLog(@"stringInGuidFormat is %@",stringInGuidFormat);

    NSUUID* nsuuid = [[NSUUID alloc] initWithUUIDString:stringInGuidFormat];
    uuid_t uuid;
    [nsuuid getUUIDBytes:uuid];
    NSData* data = [NSData dataWithBytes:uuid length:16];
    NSString* base64 = [data base64EncodedString];

    NSLog(@"base64 is %@",base64);
    return base64;

}

其中[data base64EncodedString]由Matt Gallagher

提供

这是.NET C#中用来做同样事情的类似方法:

private string convertGuidStringToBase64(string elementAsString)
{
    Guid isAsGuid = new Guid(elementAsString);
    string base64 = Convert.ToBase64String(isAsGuid.ToByteArray());
    return base64;
}

给定CBB2B719-D129-4051-B694-4204A6F6BE93的起始字符串值,我得到以下结果: iOS认为base64值是y7K3GdEpQFG2lEIEpva + kw == C#认为base64值是GbeyyynRUUC2lEIEpva + kw ==

显然我错了!任何人都可以指出我的错误,并指出我正确的方向来解决它!

非常感谢。

2 个答案:

答案 0 :(得分:1)

这看起来非常像字节顺序问题。 Base64解码后,这两个值是:

cb b2 b7 19 d1 29 40 51 b6 94 42 04 a6 f6 be 93

19 b7 b2 cb 29 d1 51 40 b6 94 42 04 a6 f6 be 93

注意前4个字节是否被反转?

如果需要相同的值,则必须确保使用相同的字节顺序。我建议转换为网络字节顺序以便于移植。

希望这有帮助

干杯 帕特里克

答案 1 :(得分:0)

Base64转换不是问题。它是标准化的,应该适用于所有平台。它将一系列字节从/转换为字符串,因此字节字节顺序不是问题。

这给我们留下了NSUUID和Guid。似乎它们在两个系统上的存储方式不同。它们以不同的顺序将它们的字节存储在内存中。字节顺序。因此,它们的Base64编码值也会有所不同。

我建议您阅读UUID和Guid,特别是他们如何将数据存储在内存中。