2014-01-10 79 views
0

我正在使用50%iOS和50%Microsoft.NET C#的系統。系統中使用的主要ID是Guids/NSUUID,並且它們會不時地轉換爲Base64字符串。我在.NET和iOS如何執行base64轉換方面存在差異。iOS和.NET之間的Base64編碼差異

這是我的目標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; 

} 

其中[數據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 +千瓦== C#認爲的base64值GbeyyynRUUC2lEIEpva +千瓦==

顯然,我有什麼不對!任何人都可以指出我的錯誤,並指出我正確的方向來解決它!

非常感謝。

+0

'data'(在ObjC部分)和'isAsGuid.ToByteArray()'之間有區別嗎? – Dirk

回答

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個字節被逆轉?

如果你想要相同的值,你必須確保使用相同的字節順序。我建議轉換爲網絡字節順序以實現可移植性。

希望這有助於

乾杯 帕特里克

+0

非常感謝Patrik – Journeyman

+0

您可以發佈解決方案嗎? – Michael90

0

Base64編碼轉換不能成爲問題。它是標準化的,應該在所有平臺上工作。它將一系列字節從/轉換爲字符串,所以字節的字節順序在這裏不成問題。

這給我們留下了NSUUID和Guid。看起來它們在兩個系統上的存儲方式不同。他們將字節以不同的順序存儲在內存中,又名。字節順序。因此,他們的Base64編碼值也會不同。

我建議你閱讀關於UUID和Guid,特別是他們如何將他們的數據存儲在內存中。

相關問題