从python到Objective C的Socket代码

2024-05-14 07:01:06 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

chr(0x00)和b64encode的等价物是什么?在

如果你们对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)

Tags: 代码srcappnewlenremotemacmsg
2条回答

此代码是一个有效的翻译。它当然可以改进,欢迎您的评论,但它工作得很好,完全像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];

插座部分:

^{pr2}$

和base64的include来自:https://github.com/nicklockwood/Base64

#include <netinet/in.h>
#include <arpa/inet.h>
#import "Base64.h"

这是部分答案。它没有解决你关于套接字的问题,因为这是我在objective-c中没有经验的领域

至于你的另外两个问题:

什么是chr(0x00)的等价物?

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

b64encode的等价物是什么?

好吧,似乎没有办法像python那样开箱即用。但是,有一个entry for this on the SO wiki,它指向this article。本文的末尾有一些源代码的链接,您应该可以按原样使用这些源代码。它的工作原理是使用categories向NSData添加方法,这将允许您对base64字符串进行编码/解码。在

相关问题 更多 >

    热门问题