编码没有在目标c中给出正确的结果

时间:2011-09-26 09:29:00

标签: objective-c encoding

我有一个编码字符串的c#代码。我正在尝试在目标c中编写相应的例程。

代码如下:

    // c# code
public static string Encode(Guid guid)
{
  string encode = convert.ToBase64String(guid.ToByteArray());
  encode = encoded.Replace("/","_").Replace("+","-");
  return encoded.substring(0,22);
}

我已在目标c中编写此代码。

- (NSString *)encode:(NSString *)inId
{
NSString *uniqueId = inId;

// convert user id in to data
NSData *userIdData = [uniqueId dataUsingEncoding:NSUTF16StringEncoding];
// convert encoded userId's data into base64EncodedString
NSString *base64String = [Base64 encode:userIdData];
//NSString *base64String = [userIdData encodeBase64ForData];

NSString *encodedId = [[NSString alloc] initWithString:base64String];
// replace "/" character in base64String into "_" character
encodedId = [encodedId stringByReplacingOccurrencesOfString:@"/" withString:@"_"];
// replace "+" character in base64String into "-" character
encodedId = [encodedId stringByReplacingOccurrencesOfString:@"+" withString:@"-"];
// get substring of range 22
encodedId = [encodedId substringToIndex:22];
NSLog(@"Base 64 encoded = %@",encodedId); 
 return encodedId;
}

我从viewDidLoad

调用此函数
NSString *encodedStr = [self encode:@"a8f9f344-d14e-4541-a8e7-0f5936e42254"];// string to encode
NSLog(@"Encoded String %@",encodedStr);

这段代码没有给我正确的结果 例如:对于字符串a8f9f344-d14e-4541-a8e7-0f5936e42254 它应该给出结果为RPP5qE7RQUWo5w9ZNuQiVA。

感谢。

1 个答案:

答案 0 :(得分:2)

您的问题是guid.ToByteArray()[uniqueId dataUsingEncoding:NSUTF16StringEncoding];不做同样的事情。据我从文档中可以看出,前者删除了连字符,并将其余部分视为16字节的十六进制ASCII表示。后者只是将每个字符转换为UTF16(实际上,它已经是UTF-16)并将其放入NSData

您需要在Objective-C中编写一些代码来获取ASCII十六进制字符串并将其转换为字节。