0

このコードをPythonからObjectiveC(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)
4

2 に答える 2

1

これは部分的な答えです。ソケットについてのあなたの質問には対応していません。それは、Objective-cに関しては私が経験したことのない分野だからです。

他の2つの質問について:

何に相当しchr(0x00)ますか?

に相当するのchr(0x<num>)は単純'0xnum'です。したがって、たとえばchr(0x00)になり'0x00'ます。C / Objective-cのPythonとは異なり、ここでは二重引用符ではなく一重引用符を使用することが重要です。これらは異なる意味を持っています。

b64encodeに相当するものは何ですか?

ええと、Pythonの場合のように、箱から出してこれを行う方法はないようです。ただし、この記事を指すSOwikiにこのエントリがあります。この記事の最後には、そのまま使用できるはずのソースコードへのリンクがあります。カテゴリを使用して、base64文字列をエンコード/デコードできるメソッドを追加することで機能します。NSData

于 2013-03-05T00:39:04.470 に答える
1

このコードは実用的な翻訳です。それは確かに改善することができ、あなたのコメントは歓迎されますが、それはうまく機能し、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に含める: https ://github.com/nicklockwood/Base64

#include <netinet/in.h>
#include <arpa/inet.h>
#import "Base64.h"
于 2013-03-05T03:58:31.620 に答える