Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在Objective-C中将十六进制字符串转换为二进制_Php_Objective C_Cocoa - Fatal编程技术网

Php 在Objective-C中将十六进制字符串转换为二进制

Php 在Objective-C中将十六进制字符串转换为二进制,php,objective-c,cocoa,Php,Objective C,Cocoa,PHP函数的等价物是什么 pack('H*', '01234567989abcdef' ); 在Objective-C中 假设您希望将结果作为NSData,可以使用类似于以下内容的函数: NSData *CreateDataWithHexString(NSString *inputString) { NSUInteger inLength = [inputString length]; unichar *inCharacters = alloca(sizeof(unichar

PHP函数的等价物是什么

pack('H*', '01234567989abcdef' );

在Objective-C中

假设您希望将结果作为NSData,可以使用类似于以下内容的函数:

NSData *CreateDataWithHexString(NSString *inputString)
{
    NSUInteger inLength = [inputString length];

    unichar *inCharacters = alloca(sizeof(unichar) * inLength);
    [inputString getCharacters:inCharacters range:NSMakeRange(0, inLength)];

    UInt8 *outBytes = malloc(sizeof(UInt8) * ((inLength / 2) + 1));

    NSInteger i, o = 0;
    UInt8 outByte = 0;
    for (i = 0; i < inLength; i++) {
        UInt8 c = inCharacters[i];
        SInt8 value = -1;

        if      (c >= '0' && c <= '9') value =      (c - '0');
        else if (c >= 'A' && c <= 'F') value = 10 + (c - 'A');
        else if (c >= 'a' && c <= 'f') value = 10 + (c - 'a');            

        if (value >= 0) {
            if (i % 2 == 1) {
                outBytes[o++] = (outByte << 4) | value;
                outByte = 0;
            } else if (i == (inLength - 1)) {
                outBytes[o++] = value << 4;
            } else {
                outByte = value;
            }

        } else {
            if (o != 0) break;
        }        
    }

    return [[NSData alloc] initWithBytesNoCopy:outBytes length:o freeWhenDone:YES];
}
NSData*createdatawithhextstring(NSString*inputString)
{
NSU整数inLength=[inputString长度];
unichar*英寸字符=alloca(尺寸(unichar)*长度);
[inputString getCharacters:inCharacters范围:NSMakeRange(0,inLength)];
UInt8*outBytes=malloc(sizeof(UInt8)*((inLength/2)+1));
NSInteger i,o=0;
UInt8 outByte=0;
对于(i=0;i='0'&&c='A'&&c='A'&&c=0){
如果(i%2==1){

outBytes[o++]=(outByte请参见
-scanHex…
NSScanner的
方法可能重复:可能重复:谢谢。Cocoa库中已经没有这样的功能了?而且看起来您正在泄漏
英寸字符
英寸字符是使用alloca分配的,alloca在堆栈上分配空间,而不是如果您正在处理大字符串,并且不愿意将堆栈指针向前推进那么远,那么您可能希望将inCharacters更改为malloc()和free()它在return.Oops之前没有看到您的第一个回复。这取决于您的使用情况-如果十六进制值足够短,您可以将其存储为无符号int或无符号long,则有-[NSScanner scanHexLongLong::]。如果您需要进行额外的提取,可以在-[NSString characters]上使用wscanf()族这不适用于奇数的十六进制字符串。您需要将else子句更改为{outByte=value;if(i==inLength-1)//这将是最后一次迭代{outBytes[o++]=outByte