我正在寻找一种很好的可可方式将NSData对象序列化为十六进制字符串.我们的想法是将用于通知的deviceToken序列化,然后再将其发送到我的服务器.
我有以下实现,但我认为必须有一些更短更好的方法来实现它.
+ (NSString*) serializeDeviceToken:(NSData*) deviceToken
{
NSMutableString *str = [NSMutableString stringWithCapacity:64];
int length = [deviceToken length];
char *bytes = malloc(sizeof(char) * length);
[deviceToken getBytes:bytes length:length];
for (int i = 0; i < length; i++)
{
[str appendFormat:@"%02.2hhX", bytes[i]];
}
free(bytes);
return str;
}
Run Code Online (Sandbox Code Playgroud) 在objective-c中它看起来像这样:
#include <sys/xattr.h>
@implementation NSString (reverse)
-(NSString*)sha1
{
NSData *data = [self dataUsingEncoding:NSUTF8StringEncoding];
uint8_t digest[CC_SHA1_DIGEST_LENGTH];
CC_SHA1(data.bytes, (int)data.length, digest);
NSMutableString *output = [NSMutableString stringWithCapacity:CC_SHA1_DIGEST_LENGTH * 2];
for (int i = 0; i < CC_SHA1_DIGEST_LENGTH; i++)
[output appendFormat:@"%02x", digest[i]];
return output;
}
@end
Run Code Online (Sandbox Code Playgroud)
我需要Swift这样的东西,有可能吗?
请展示工作示例.
如何使用NSLog打印NSData对象的内容:
-(void) post:(NSString*) msg to:(NSString*) link{
NSString *myRequestString = [NSString stringWithFormat:@"message=%@", msg];
NSData *myRequestData = [NSData dataWithBytes: [myRequestString UTF8String] length: [myRequestString length]];
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL: [NSURL URLWithString: link]];
[request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"content-type"];
[request setHTTPMethod: @"POST"];
[request setHTTPBody: myRequestData];
NSData *returnData = [NSURLConnection sendSynchronousRequest: request returningResponse: nil error: nil];
NSLog("%@", *returnData); //doesn't work
}
Run Code Online (Sandbox Code Playgroud)
我想打印*returnData的内容...
这是我的功能.首先println
打印正确的哈希到控制台,但在下一行程序崩溃.你能帮助我吗?
func sha256(string: NSString) -> NSString {
var data : NSData! = string.dataUsingEncoding(NSUTF8StringEncoding)
var hash = [UInt8](count: Int(CC_SHA256_DIGEST_LENGTH), repeatedValue: 0)
CC_SHA256(data.bytes, CC_LONG(data.length), &hash)
let res = NSData(bytes: hash, length: Int(CC_SHA256_DIGEST_LENGTH))
println(res)
let resstr = NSString(data: res, encoding: NSUTF8StringEncoding)
println(resstr)
return resstr
}
Run Code Online (Sandbox Code Playgroud) 我有一个iPhone应用程序我正在努力并试图让Amazon SNS设置为测试PNS.当我们向APNS注册应用程序时,它会提供一个32位的设备令牌(873DBDDA-17CF-4A24-88C6-990B90AFC4C3).使用Amazon SNS注册设备时,它表示设备令牌必须为64位长.我在这里错过了什么?
参考以下问题:将NSData转换为HEX NSString
我使用Erik Aigner提供的解决方案解决了这个问题,即:
NSData *data = ...;
NSUInteger capacity = [data length] * 2;
NSMutableString *stringBuffer = [NSMutableString stringWithCapacity:capacity];
const unsigned char *dataBuffer = [data bytes];
NSInteger i;
for (i=0; i<[data length]; ++i) {
[stringBuffer appendFormat:@"%02X", (NSUInteger)dataBuffer[i]];
}
Run Code Online (Sandbox Code Playgroud)
但是,有一个小问题,如果后面有额外的零,则字符串值会有所不同.例如.如果hexa数据是字符串@"3700000000000000",则使用扫描程序转换为整数时:
unsigned result = 0;
NSScanner *scanner = [NSScanner scannerWithString:stringBuffer];
[scanner scanHexInt:&result];
NSLog(@"INTEGER: %u",result);
Run Code Online (Sandbox Code Playgroud)
结果将是4294967295,这是不正确的.不应该是55,因为只有hexa 37被采取?
那么如何摆脱零呢?
编辑:(回应CRD)
嗨,谢谢你澄清我的疑虑.那你要做的是直接从一个字节指针读取64位整数吧?不过我有另一个问题.你如何实际将NSData转换为字节指针?
为了让您更容易理解,我将解释我最初的所作所为.
首先,我显示了我拥有的文件的数据(数据是十六进制)
NSData *file = [NSData dataWithContentsOfFile:@"file path here"];
NSLog(@"Patch File: %@",file);
Run Code Online (Sandbox Code Playgroud)
输出:
接下来,我读取并偏移文件的前8个字节并将它们转换为字符串.
// 0-8 bytes
[file seekToFileOffset:0];
NSData *b …
Run Code Online (Sandbox Code Playgroud) 我知道之前已经问过这个问题了,我已经采用了几种方法,但是它们不起作用.
以下是我已经尝试过的:
NSString *newStr = [NSString stringWithUTF8String:[responseData bytes]];
NSString *newStr = [NSString stringWithFormat:@"%.*s", [responseData length], [responseData bytes]];
Run Code Online (Sandbox Code Playgroud)
它们都不起作用.在第一种情况下,它用null填充newStr.在第二,它填充垃圾字符.我从调试器日志(po responseData)知道我得到了有效的响应,就像bbbbbb 00 bbbbbb.[服务器将它们作为字节数组发送]
该怎么办?
编辑:我从http请求响应中接收此数据 - 使用ASIHTTPRequest库,以防任何人可以在该行上提供帮助.
我尝试使用以下代码将NSData转换为十六进制字符串值,但都错了?
这里的"结果"是我的NSdata
我需要一个十六进制字符串作为输出,但我没有得到它
NSUInteger dataLength = [result length];
NSLog(@"%d",dataLength);
NSMutableString *string = [NSMutableString stringWithCapacity:dataLength*2];
const unsigned char *dataBytes = [result bytes];
for (NSInteger idx = 0; idx < dataLength; ++idx) { [string appendFormat:@"%02x", dataBytes[idx]];
}
NSLog(@"%@",string);
Run Code Online (Sandbox Code Playgroud)
我怎么能转换这个请
更新:结果数据包含加密字符串.我想将其转换为十六进制值
当我在SNS控制台中设置端点时,我有推动工作.现在我开始允许iOS应用程序创建端点.然后是订阅.
问题是BFTask *task = [sns createPlatformEndpoint:request];
返回,task.result是零,而不是AWSSNSCreateEndpointResponse*
.BTW,task.error也是零.
来自.h文件:
亚马逊已经在SDK v2中为SNS创建了网络示例.所以我也在寻找可能使用SDK v2创建端点和订阅的一些示例的人.
应用程序启动后,我调用我的方法:
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
[self awsStartWithDeviceToken:deviceToken];
}
Run Code Online (Sandbox Code Playgroud)
代码:
- (void)awsStartWithDeviceToken:(NSData *)deviceToken {
// Get a hex string for the NSData deviceToken
// http://stackoverflow.com/questions/7520615/how-to-convert-an-nsdata-into-an-nsstring-hex-string
NSUInteger dataLength = [deviceToken length];
NSMutableString *deviceTokenString = [NSMutableString stringWithCapacity:dataLength*2];
const unsigned char *dataBytes = [deviceToken bytes];
for (NSInteger idx = 0; idx < dataLength; ++idx) {
[deviceTokenString appendFormat:@"%02x", dataBytes[idx]];
}
// Set the log level
[AWSLogger …
Run Code Online (Sandbox Code Playgroud) ios ×4
nsdata ×4
iphone ×3
nsstring ×3
objective-c ×3
hex ×2
swift ×2
amazon-sns ×1
cocoa ×1
cocoa-touch ×1
nsscanner ×1
sha1 ×1