String zerlegen und in Binärcode umwandeln

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • String zerlegen und in Binärcode umwandeln

    Hallo liebe Gemeinde,

    leider komme ich selbst nicht weiter.

    Ich sitze immer noch an meiner QR-Code App.

    Der QR-Code lässt sich auslesen und über NSString *qrCode = [metadataObj stringValue] in eine Variable legen.

    Der String wird mit eine 22. stelligen Zahl sein: bspw. 2213547728394028473622
    Nun möchte ich diesen String zerlegen in die ersten 4 Ziffern und dann in die nächsten 2 Ziffern und dann wieder die nächsten 4. Diese sollen wieder neue Strings ergeben.

    Anschließend möchte ich diese String in Ihrem binären Wert umwandeln. Also aus 2 wird 0010.

    Leider werde ich nicht schlau daraus, wie ich meinen 22stelligen qrCode zerlegen und umwandeln kann.

    Hat hier einer Erfahrung?
  • MCDan schrieb:

    Versuche es mal so:

    Quellcode

    1. NSString *qrCode = [metadataObj stringValue];

    @MCDan War gut gemeint.^^

    Daniel86 schrieb:

    NSString *qrCode = [metadataObj stringValue]

    Wieso taucht hier in einem anderen Thread dieses Codesschnipsel auf, das noch nicht einmal kompilieren kann!!??? Das heißt doch, @Daniel86, daß Du noch nicht mal live ausprobiert hast, was Du an anderer Stelle bekommst.

    Ist das ein Projekt eines Fernlehrgangs?

    Nichts für ungut, aber wenn Du das schon machst, dann mach es doch als follow ups in einem Thread…
    Das iPhone sagt: "Zum Antworten streichen". Wie? Echt Jetzt? Muß ich erst die Wohnung streichen!?
  • Ich weis nicht was Du meinst?
    Der Code funktioniert bei mir:


    C-Quellcode

    1. NSString *QRCode = @"Anfangswert";//dient nur der Überprüfung
    2. ...
    3. -(void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection{
    4. if (metadataObjects != nil && [metadataObjects count] > 0) {
    5. AVMetadataMachineReadableCodeObject *metadataObj = [metadataObjects objectAtIndex:0];
    6. if ([[metadataObj type] isEqualToString:AVMetadataObjectTypeQRCode]) {
    7. [_lblStatus performSelectorOnMainThread:@selector(setText:) withObject:[metadataObj stringValue] waitUntilDone:NO];
    8. QRCode = [metadataObj stringValue];
    9. NSLog (@"QR-Code ist: %@",QRCode); //prüft ob QRCode richtig angelegt wird.
    Alles anzeigen
    Habs geprüft und mir wird der QR-Code in der App angezeigt und auch XCode liest Ihn richtig aus (Test die Variable QRCode mit dem NSLog... auf Richtigkeit.)


    Ich möchte jetzt halt gerne die Variable QRCode zerlegen und in den entsprechenden Binärwert umwandeln. Wie oben beschrieben.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von Daniel86 ()

  • Du könntest durch den String iterieren und dann mit einer geshifteten 1er-Maske per AND-Operator herausfinden, ob das entsprechende Bit gesetzt ist. Dann „0“ oder „1“ an ein NSMutableString anhängen. Irgendwie wie @Thallius‘ Hinweis „wie in C(++)“...

    Google mal „NSString format binary“, da gibt es Beispiele.

    Mattes
    Diese Seite bleibt aus technischen Gründen unbedruckt.
  • Daniel86 schrieb:

    Ich weis nicht was Du meinst?

    Sorry. Ich habe das j in [metadataObj stringValue] als ] gelesen. Dann klappen natürlich die Klammern nicht. Sorry. Mea Culpa. o_O
    War nicht böse gemeint.^^

    Diese kleinen Pixel auf dem Bildschirm und meine Brille haben zunehmend ein Problem mit dem Weltfrieden… o_O
    Das iPhone sagt: "Zum Antworten streichen". Wie? Echt Jetzt? Muß ich erst die Wohnung streichen!?
  • MyMattes schrieb:

    Du könntest durch den String iterieren und dann mit einer geshifteten 1er-Maske per AND-Operator herausfinden, ob das entsprechende Bit gesetzt ist. Dann „0“ oder „1“ an ein NSMutableString anhängen. Irgendwie wie @Thallius‘ Hinweis „wie in C(++)“...

    Google mal „NSString format binary“, da gibt es Beispiele.

    Mattes
    Ich will nicht jede Ziffer einzeln auslesen, sondern blockweise, wobei die Blöcke unterschiedlich lang sind und einen neuen String darstellen.
    Bspe. String 1 hat 4 Ziffern umd String 2 besteht dann aus den nächsten 3 Ziffern. Und das möchte ich dann in Binärwerte umwandeln.
  • Wenn Du einen Blick in die Doku zu NSString wirfst, dann findest Du dort unter Dividing Strings z.B. die Methode substringWithRange:

    Damit kannst Du einen String in diverse Bereiche "zerlegen" bzw. erhältst den gewünschten Bereich in einem neuen String zurück. ;)

    Unter Getting Numeric Values gibt es diverse Methode wir z.B. integerValue, um von einem String den Integer Wert zu ermitteln, falls möglich.

    Um dann einen Integer Wert als Binary auszugeben, gibt es leider keine Methode in Foundation oder einem anderen iOS Framework. Zumindest ist mir diesbezüglich nichts bekannt.

    Google spuckt jedoch einige Methoden aus, die Du ggf. verwenden kannst.
  • nussratte schrieb:

    Die qr Sachen sind doch auch nur kopiert.
    Jetzt gib ihm schon jemand den fertigen Code
    Nö!

    ich weiss ja noch nicht mal, was er wirklich will:

    Daniel86 schrieb:


    Der String wird mit eine 22. stelligen Zahl sein: bspw. 2213547728394028473622
    Nun möchte ich diesen String zerlegen in die ersten 4 Ziffern und dann in die nächsten 2 Ziffern und dann wieder die nächsten 4. Diese sollen wieder neue Strings ergeben.

    Anschließend möchte ich diese String in Ihrem binären Wert umwandeln. Also aus 2 wird 0010.
    Ich nehme z.B. die ersten 4 Ziffern und erhalte "2213". Was soll das ergeben? Sollen die einzelnen Ziffern direkt in ihrer BCD-Form umgewandelt werden, also in das:
    0010 0010 0001 0011
    oder wird diese Folge an Ziffern zunächst in ein Integer gewandelt und dann zu einer Binärzahl, also:
    0000 1000 1010 0101
    ?
  • MCDan schrieb:

    Um dann einen Integer Wert als Binary auszugeben, gibt es leider keine Methode in Foundation oder einem anderen iOS Framework. Zumindest ist mir diesbezüglich nichts bekannt.

    Swift hat in der stdlib mit einem String-Initializer was passendes dafür:

    Quellcode

    1. let bin = String(21, radix:2)
    2. print(bin) // "10101"
    Das nur so am Rande…
    Das iPhone sagt: "Zum Antworten streichen". Wie? Echt Jetzt? Muß ich erst die Wohnung streichen!?
  • Hallo,

    danke nochmal für die, die helfen. Ich bin in XCode und C objective jetzt quer eingestiegen. Daher scheitert es teils an den einfachsten Dingen. Ich suche zwar das Netz durch finde aber auch nicht immer das, was ich brauche.
    Das Trennen des String mache ich jetzt wie folgt:

    C-Quellcode

    1. NSString *qrtest = @"22314455";
    2. NSString *string1 = [qrtest substringWithRange:NSMakeRange(0, 4)];
    3. NSString *string2 = [qrtest substringWithRange:NSMakeRange(4, 4)];

    Ich möchte aus der aktuellen Methode einen Wert (den QR-Code String) zurückgeben und in einer anderen Klasse bearbeiten lassen.
    Wie funktioniert das? Oder wo finde ich da Hinweise, um den QR-Code aus der Methode ViewController.m herauszubekommen?

    Aktuell sieht es so aus:

    C-Quellcode: viewcontroller.h

    1. #import <AVFoundation/AVFoundation.h>
    2. @interface ViewController : UIViewController <AVCaptureMetadataOutputObjectsDelegate>
    3. //...
    4. - (IBAction)startStopReading:(id)sender;
    5. @end

    C-Quellcode: ViewController.m

    1. #import "ViewController.h"
    2. @interface ViewController ()
    3. @property (nonatomic) BOOL isReading;
    4. @property (nonatomic, strong) AVCaptureSession *captureSession;
    5. @property (nonatomic, strong) AVCaptureVideoPreviewLayer *videoPreviewLayer;
    6. -(BOOL)startReading;
    7. -(void)stopReading;
    8. @end
    9. @implementation ViewController
    10. NSString *QRCode = @"test_Anfangswert";
    11. - (void)viewDidLoad
    12. {
    13. [super viewDidLoad];
    14. _isReading = NO;
    15. _captureSession = nil;
    16. }
    17. - (IBAction)startStopReading:(id)sender {
    18. if (!_isReading) {
    19. if ([self startReading]) {
    20. [_bbitemStart setTitle:@"Halt an!"];
    21. [_lblStatus setText:@"Zeig mir den QR-Code!"];
    22. }
    23. }
    24. else{
    25. [self stopReading];
    26. [_bbitemStart setTitle:@"Leg los!"];
    27. }
    28. _isReading = !_isReading;
    29. }
    30. - (BOOL)startReading {
    31. NSError *error;
    32. AVCaptureDevice *captureDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
    33. AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:captureDevice error:&error];
    34. if (!input) {
    35. NSLog(@"%@", [error localizedDescription]);
    36. return NO;
    37. }
    38. _captureSession = [[AVCaptureSession alloc] init];
    39. [_captureSession addInput:input];
    40. AVCaptureMetadataOutput *captureMetadataOutput = [[AVCaptureMetadataOutput alloc] init];
    41. [_captureSession addOutput:captureMetadataOutput];
    42. dispatch_queue_t dispatchQueue;
    43. dispatchQueue = dispatch_queue_create("myQueue", NULL);
    44. [captureMetadataOutput setMetadataObjectsDelegate:self queue:dispatchQueue];
    45. [captureMetadataOutput setMetadataObjectTypes:[NSArray arrayWithObject:AVMetadataObjectTypeQRCode]];
    46. _videoPreviewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:_captureSession];
    47. [_videoPreviewLayer setVideoGravity:AVLayerVideoGravityResizeAspectFill];
    48. [_videoPreviewLayer setFrame:_viewPreview.layer.bounds];
    49. [_viewPreview.layer addSublayer:_videoPreviewLayer];
    50. [_captureSession startRunning];
    51. return YES;
    52. }
    53. -(void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection{
    54. if (metadataObjects != nil && [metadataObjects count] > 0) {
    55. AVMetadataMachineReadableCodeObject *metadataObj = [metadataObjects objectAtIndex:0];
    56. if ([[metadataObj type] isEqualToString:AVMetadataObjectTypeQRCode]) {
    57. [_lblStatus performSelectorOnMainThread:@selector(setText:) withObject:[metadataObj stringValue] waitUntilDone:NO];
    58. QRCode = [metadataObj stringValue];
    59. [self performSelectorOnMainThread:@selector(stopReading) withObject:nil waitUntilDone:NO];
    60. [_lblTest performSelectorOnMainThread:@selector(setText:) withObject:QRCode waitUntilDone:NO];
    61. _isReading = NO;
    62. }
    63. }
    64. }
    65. -(void)stopReading{
    66. [_captureSession stopRunning];
    67. _captureSession = nil;
    68. [_videoPreviewLayer removeFromSuperlayer];
    69. }
    Alles anzeigen