我正在开发一个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 ==
显然我错了!任何人都可以指出我的错误,并指出我正确的方向来解决它!
非常感谢。
答案 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,特别是他们如何将数据存储在内存中。