Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/331.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
从python到Objective C的套接字代码_Python_Ios_Objective C_Cocoa_Sockets - Fatal编程技术网

从python到Objective C的套接字代码

从python到Objective C的套接字代码,python,ios,objective-c,cocoa,sockets,Python,Ios,Objective C,Cocoa,Sockets,我需要一些帮助来将这段代码从Python翻译成Objective C(用于iOS) 我知道如何在C中创建套接字,但也许用cocoa类(NSStream?)来创建套接字是一种最优雅的方法 chr(0x00)和B64编码的等价物是什么 如果你们对Python和Objective有一定的了解,谢谢你们的帮助 new = socket.socket(socket.AF_INET, socket.SOCK_STREAM) new.connect((dst, 55000)) msg = chr(0x64)

我需要一些帮助来将这段代码从Python翻译成Objective C(用于iOS)

我知道如何在C中创建套接字,但也许用cocoa类(NSStream?)来创建套接字是一种最优雅的方法

chr(0x00)和B64编码的等价物是什么

如果你们对Python和Objective有一定的了解,谢谢你们的帮助

new = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
new.connect((dst, 55000))

msg = chr(0x64) + chr(0x00) +\
    chr(len(base64.b64encode(src)))    + chr(0x00) + base64.b64encode(src) +\
    chr(len(base64.b64encode(mac)))    + chr(0x00) + base64.b64encode(mac) +\
    chr(len(base64.b64encode(remote))) + chr(0x00) + base64.b64encode(remote)

pkt = chr(0x00) +\
    chr(len(app)) + chr(0x00) + app +\
    chr(len(msg)) + chr(0x00) + msg
new.send(pkt)

这是部分答案。它没有解决你关于插座的问题,因为这是我在objective-c方面没有经验的领域

至于你的另外两个问题:

什么是
chr(0x00)

chr(0x)
的等价物只是
'0xnum'
。例如,
chr(0x00)
变成了
'0x00'
。请注意,这里使用单引号而不是双引号很重要,因为与C/objective-C中的python不同,它们具有不同的含义

什么是B64编码的等价物?


好吧,看起来不像python那样有一种开箱即用的方法。然而,有一个问题需要解决。这篇文章的最后有一个链接,链接中有一些源代码,您应该可以按原样使用它们。它通过使用类别将方法添加到
NSData
,从而允许您对base64字符串进行编码/解码。

此代码是一个有效的翻译。它当然可以改进,您的评论也很受欢迎,但是它工作得很好,并且与Python代码完全一样

NSString * src = @"X.X.X.X";
NSString * mac = @"XX-XX-XX-XX-XX-XX";


const unsigned char byte64[] = {0x64};
const unsigned char byte00[] = {0x00};

NSString * srcString = [src base64EncodedString];
int srcDataLength = [srcString length];
char* srcDataLengthAsByte = (char*) &srcDataLength;

NSString * macString = [mac base64EncodedString];
int macDataLength = [macString length];
char* macDataLengthAsByte = (char*) &macDataLength;

NSString * remoteString = [remote base64EncodedString];
int remoteDataLength = [remoteString length];
char* remoteDataLengthAsByte = (char*) &remoteDataLength;

NSString * appString = [app base64EncodedString];
int appDataLength = [appString length];
char* appDataLengthAsByte = (char*) &appDataLength;

NSMutableData * msgData = [NSMutableData data];
[msgData appendBytes:byte64 length:1];
[msgData appendBytes:byte00 length:1];
[msgData appendBytes:srcDataLengthAsByte length:1];
[msgData appendBytes:byte00 length:1];
[msgData appendData:[srcString dataUsingEncoding:NSASCIIStringEncoding]];
[msgData appendBytes:macDataLengthAsByte length:1];
[msgData appendBytes:byte00 length:1];
[msgData appendData:[macString dataUsingEncoding:NSASCIIStringEncoding]];
[msgData appendBytes:remoteDataLengthAsByte length:1];
[msgData appendBytes:byte00 length:1];
[msgData appendData:[remoteString dataUsingEncoding:NSASCIIStringEncoding]];
int msgDataLength = [msgData length];
char* msgDataLengthAsByte = (char*) &msgDataLength;

NSMutableData * packet = [NSMutableData data];
[packet appendBytes:byte00 length:1];
[packet appendBytes:appDataLengthAsByte length:1];
[packet appendBytes:byte00 length:1];
[packet appendData:[appString dataUsingEncoding:NSASCIIStringEncoding]];
[packet appendBytes:msgDataLengthAsByte length:1];
[packet appendBytes:byte00 length:1];
[packet appendData:msgData];
[self send:packet];
以及插座部分:

- (BOOL)connect
{
    struct sockaddr_in addr;
    sockfd = socket( AF_INET, SOCK_STREAM, 0 );
    addr.sin_family = AF_INET;
    addr.sin_addr.s_addr = inet_addr([TV_IP UTF8String]);
    addr.sin_port = htons(TV_PORT);
    return connect(sockfd, (struct sockaddr*)&addr, sizeof(addr))==0;
}

- (long)send:(NSData*)data
{
    long sent = send(sockfd, [data bytes], [data length], 0);

    VADebugLog(@"sent data:(%ld bytes) = [%@]",sent,[data description]);

    return sent;
}

-(void)close
{
    close(sockfd);
}
以及包含base64的源代码:

#包括
#包括
#导入“Base64.h”

好的,谢谢。我在最初的问题中写下了翻译的开头。你觉得它好看吗?我认为有一种更好的方法来编写这种平静的代码……我不认为
'0x00'
是您想要的。你是说可能是
'\x00'
?或者干脆不加引号的
0x00
?我用gcc试过,它在C中工作,这意味着它应该适用于objc。
#include <netinet/in.h>
#include <arpa/inet.h>
#import "Base64.h"