我有以下Objective-C函数:
+(NSString *)stringToSha1:(NSString *)str{
NSMutableData *dataToHash = [[NSMutableData alloc] init];
[dataToHash appendData:[str dataUsingEncoding:NSUTF8StringEncoding]];
unsigned char hashBytes[CC_SHA1_DIGEST_LENGTH];
CC_SHA1([dataToHash bytes], [dataToHash length], hashBytes);
NSData *encodedData = [NSData dataWithBytes:hashBytes length:CC_SHA1_DIGEST_LENGTH];
[dataToHash release];
NSString *encodedStr = [NSString stringWithUTF8String:[encodedData bytes]];
//NSString *encodedStr = [[NSString alloc] initWithBytes:[encodedData bytes]
// length:[encodedData length] encoding: NSUTF8StringEncoding];
NSLog(@"String is %@", encodedStr);
return encodedStr;
}
Run Code Online (Sandbox Code Playgroud)
我要做的是采用NSString和SHA1编码.这部分似乎正在起作用,我认为我所处的位置是如何将NSData对象转换回清晰的字符串.如果我使用UTF8编码,我会变成空白,如果我说ASCII,我会得到奇怪的字符.我真正想要的是十六进制字符串,但我不知道如何获得它.这是使用iPhone 3.0 SDK.
目前,我传入的任何String都会返回NULL.
回到我每天愚蠢的问题.今天我正在尝试在NSArray中放置一个结构.好吧,这很容易,将它包装在NSData中.如果你认识我,你知道你将会看到代码.在这个例子中,我将一个从Wavefront OBJ加载到结构中的顶点线并将其粘贴在一个数组中.
NSArray *verticeLineParts = [currentLine componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
Coordinate c = CoordinateMake([[verticeLineParts objectAtIndex:1] floatValue],
[[verticeLineParts objectAtIndex:2] floatValue],
[[verticeLineParts objectAtIndex:3] floatValue]);
[vertices addObject:[[NSData alloc] initWithBytes:&c length:sizeof(c)]];
Run Code Online (Sandbox Code Playgroud)
这似乎工作正常.输出中的前几个对象:
2010-10-18 14:18:08.237 ObjLoader[3778:207] (
<5d1613bd 13f3da3f 8ac745bd>,
<f04c28bd 13f3da3f d88048bd>,
<649427bd d61ddb3f d88048bd>,
<477625bd d845db3f d88048bd>,
<4c1722bd 1668db3f d88048bd>,
Run Code Online (Sandbox Code Playgroud)
在从阵列中拉出它们之后将它们打印出来,而不是那么多.违规代码:
for (int i = 0; i < [vertices count]; i++) {
Coordinate c;
fillCoordinateFromData(c, [vertices objectAtIndex:i]);
NSLog(@"%@", CoordinateToNSString(c));
}
[snip]
void fillCoordinateFromData(Coordinate c, NSData *d) {
void *bytes = malloc(12);
[d getBytes:bytes];
memcpy((void *)&c, …Run Code Online (Sandbox Code Playgroud) 我有一个简单的NSString,我将它转换为NSData:
NSData *data = [[NSData dataWithBytes:[[NSString stringWithFormat:@",%@",self.targetId] dataUsingEncoding:NSASCIIStringEncoding]
length:[[NSString stringWithFormat:@",%@",self.targetId] lengthOfBytesUsingEncoding:NSASCIIStringEncoding]] retain];
Run Code Online (Sandbox Code Playgroud)
现在我想从NSData对象中获取纯文本.
如果我这样做:
NSString* dataStr = [NSString stringWithFormat:@"%@",data];
Run Code Online (Sandbox Code Playgroud)
- 我只得到一个十六进制表达式(即<9c3f473e 02000000 0b0000>)而不是我想要的普通字符串!
我也尝试过使用initWithData -
NSString* dataStr = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding];
Run Code Online (Sandbox Code Playgroud)
但无论我给出哪种编码,它总是表现得很狡猾.
你能帮忙吗?:)
我正在使用一些技巧来尝试在写入磁盘时读取AVAssetWriter的原始输出.当我通过连接它们重新组装单个文件时,生成的文件与AVAssetWriter的输出文件具有相同的确切字节数.但是,重新组装的文件将无法在QuickTime中播放或由FFmpeg解析,因为存在数据损坏.这里和那里的几个字节已经改变,使得结果文件无法使用.我假设这发生在每次读取的EOF边界上,但它不是一致的损坏.
我计划最终使用与此类似的代码从编码器中解析出单个H.264 NAL单元以将它们打包并通过RTP发送它们,但是如果我不相信从磁盘读取的数据,我可能不得不使用另一种解决方案.
是否有解释/修复此数据损坏?您是否有任何其他资源/链接可以解析如何解析NAL单元以通过RTP进行打包?
完整代码:AVAppleEncoder.m
// Modified from
// http://www.davidhamrick.com/2011/10/13/Monitoring-Files-With-GCD-Being-Edited-With-A-Text-Editor.html
- (void)watchOutputFileHandle
{
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
int fildes = open([[movieURL path] UTF8String], O_EVTONLY);
source = dispatch_source_create(DISPATCH_SOURCE_TYPE_VNODE,fildes,
DISPATCH_VNODE_DELETE | DISPATCH_VNODE_WRITE | DISPATCH_VNODE_EXTEND | DISPATCH_VNODE_ATTRIB | DISPATCH_VNODE_LINK | DISPATCH_VNODE_RENAME | DISPATCH_VNODE_REVOKE,
queue);
dispatch_source_set_event_handler(source, ^
{
unsigned long flags = dispatch_source_get_data(source);
if(flags & DISPATCH_VNODE_DELETE)
{
dispatch_source_cancel(source);
//[blockSelf watchStyleSheet:path];
}
if(flags & DISPATCH_VNODE_EXTEND)
{
//NSLog(@"File size changed");
NSError *error = nil;
NSFileHandle *fileHandle = [NSFileHandle fileHandleForReadingFromURL:movieURL error:&error];
if (error) {
[self …Run Code Online (Sandbox Code Playgroud) objective-c nsdata h.264 grand-central-dispatch avassetwriter
我在swift中将NSData转换为NSString时遇到问题.我正在使用我认为正确的命令和格式:NSString(data: <DATA>, encoding: <ENCODING>)但无论我做什么,我总是以零值结束.我正在运行最新的Xcode测试版,所以我不确定这是否相关,但我希望这是一个简单的错误,我遇到了.
我附上了游乐场代码和屏幕截图.
import Foundation
//: # NSData to String Conversion Playground
//: ### Step 1
//: The first step is to take an array of bytes and conver them into a NSData object. The bytes are as follows:
var testBytes : [UInt8] = [0x14, 0x00, 0xAB, 0x45, 0x49, 0x1F, 0xEF, 0x15, 0xA8, 0x89, 0x78, 0x0F, 0x09, 0xA9, 0x07, 0xB0, 0x01, 0x20, 0x01, 0x4E, 0x38, 0x32, 0x35, 0x56, 0x20, 0x20, 0x20, …Run Code Online (Sandbox Code Playgroud) 我正在试图找出如何NSData在特定值上"chunk"a .
7E 55 33 22 7E 7E 22 AE BC 7E 7E AA AA 00 20 00 22 53 25 A3 4E 7E
返回一个由3个元素组成的数组,[NSData]其中元素为:
55 33 2222 AE BCAA AA 00 20 00 22 53 25 A3 4E我知道我可以这样做:
var ptr = UnsafePointer<UInt8>(data.bytes)
var bytes = UnsafeBufferPointer<UInt8>(start: ptr, count: data.length)
Run Code Online (Sandbox Code Playgroud)
而且我想通过做类似的比较迭代:
bytes[1] == UInt8(0x7E)
Run Code Online (Sandbox Code Playgroud)
我想建立"范围",但我想知道是否有更好的方法来解决这个问题?
private fund chunkMessage(data: NSData) -> [NSData] {
var ptr = UnsafePointer<UInt8>(data.bytes)
var bytes = …Run Code Online (Sandbox Code Playgroud) 我在Objective-C中对这些方法进行了研究.它们只是校验和而XORNSData
- (void)XOR:(NSMutableData *)inputData withKey:(NSData *)key
{
unsigned char* inputByteData = (unsigned char*)[inputData mutableBytes];
unsigned char* keyByteData = (unsigned char*)[key bytes];
for (int i = 0; i < [inputData length]; i++)
{
inputByteData[i] = inputByteData[i] ^ keyByteData[i % [key length]];
}
}
- (Byte)checkSum:(NSMutableData *)data withLength:(Byte)dataLength
{
Byte * dataByte = (Byte *)malloc(dataLength);
memcpy(dataByte, [data bytes], dataLength);
Byte result = 0;
int count = 0;
while (dataLength>0) {
result += dataByte[count];
dataLength--;
count++;
};
result = result&0xff;
return result&0xff; …Run Code Online (Sandbox Code Playgroud) 嗨,我正在尝试将pdf文件另存为jpg文件。我有许多要查询的网址,这些网址链接都是1页pdf文件。
var path = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] as! String
let urlRequest = NSURLRequest(URL: NSURL(string: downloadUrl[index])!)
NSURLConnection.sendAsynchronousRequest(urlRequest, queue: NSOperationQueue.mainQueue()) { (response, data, error) -> Void in
var savePath = path.stringByAppendingPathComponent(file_name + ".jpg")
if let httpResponse = response as? NSHTTPURLResponse {
if let contentType = httpResponse.allHeaderFields["Content-Type"] as? NSString {
let fileType = contentType.componentsSeparatedByString("/").last! as! String
if fileType == "pdf" {
// convert to jpg before saving!
NSFileManager.defaultManager().createFileAtPath(savePath, contents: convertedData, attributes: nil)
} else {
NSFileManager.defaultManager().createFileAtPath(savePath, contents: data, attributes: nil)
}
self.tableView.reloadData()
} …Run Code Online (Sandbox Code Playgroud) 我最近在swift中找到了一个源代码,我正在尝试将它转换为Objective-C.我无法理解的一件事是:
var theData:UInt8!
theData = 3;
NSData(bytes: [theData] as [UInt8], length: 1)
Run Code Online (Sandbox Code Playgroud)
任何人都可以帮助我使用Obj-C等效物吗?
为了给你一些上下文,我需要将UInt8作为UInt8发送到CoreBluetooth外设(CBPeripheral).浮点数或整数不起作用,因为数据类型太大.
我有一个非常大的视频,我需要将这个视频分块,然后将其上传到Dropbox.
我试图使用NSData,但因为这个文件太大,我的应用程序总是崩溃,所以我不知道我现在能做什么.
对于较小的视频,我使用了这个:
NSData(contentsOfURL: self.newAsset.URL)!.subdataWithRange(NSMakeRange(0, 10000000))
Run Code Online (Sandbox Code Playgroud)
我没有任何问题,但是当视频太大时我有一个错误:
无法分配内存
那么,我可以做些什么来分块大型视频的数据呢?