iOS/C: Konvertieren "integer" in vier Zeichenkette
Eine Menge der Konstanten, die im Zusammenhang mit Audio-Session-Programmierung sind wirklich vier-Zeichen-strings (Audio-Session-Dienste-Referenz). Das gleiche gilt für die OSStatus-code von Funktionen zurückgegeben wie AudioSessionGetProperty
.
Das problem ist, dass wenn ich versuchen zu drucken, diese Dinge aus der box, Sie sehen aus wie 1919902568. Ich kann die Stecker, die in den Rechner ein und biegen Sie auf die ASCII-Ausgabe und es wird mir sagen, "roch", sondern es muss eine programmatische Art und Weise, dies zu tun.
Ich hatte nur begrenzten Erfolg in einem meiner C-Funktionen mit den folgenden block:
char str[20];
//see if it appears to be a four-character code
*(UInt32 *) (str + 1) = CFSwapInt32HostToBig(error);
if (isprint(str[1]) && isprint(str[2]) && isprint(str[3]) && isprint(str[4])) {
str[0] = str[5] = '\'';
str[6] = '\0';
} else {
//no, format as integer
sprintf(str, "%d", (int)error);
}
Was ich tun möchte, ist zu abstrahieren, diese Funktion aus der aktuellen Funktion, um es an anderer Stelle. Ich habe versucht zu tun,
char * fourCharCode(UInt32 code) {
//block
}
void someOtherFunction(UInt32 foo){
printf("%s\n",fourCharCode(foo));
}
aber das gibt mir "à*€/3íT:ê*€/+€/", nicht "roch". Meine C-fu ist nicht sehr stark, aber meine Vermutung ist, dass die oben genannten code versucht zu interpretieren, wird die Speicher-Adresse als string. Oder vielleicht gibt es ein encoding-Problem? Irgendwelche Ideen?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den Typ, den Sie sprechen, ist eine
FourCharCode
, definiert inCFBase.h
. Es ist äquivalent zu einemOSType
. Der einfachste Weg zum konvertieren zwischenOSType
undNSString
ist mitNSFileTypeForHFSTypeCode()
undNSHFSTypeCodeFromFileType()
. Diese Funktionen leider nicht auf iOS verfügbar.Für iOS-und Cocoa-portablen code, wie ich Joachim Bengtsson ist
FourCC2Str()
aus seinerNCCommon.h
(plus ein wenig casting-Bereinigung für eine einfachere Nutzung):Natürlich könnten Sie werfen die
@()
in das makro für eine noch einfachere Nutzung.NSFileTypeForHFSTypeCode
für1634039412
ärgerlicherweise gibt eine 6-Länge"\'aevt\'"
mit den einfachen Anführungszeichen eingeschlossen :/Swift verwenden Sie diese Funktion:
Diese func wird das gleiche tun wie oben in einem Drittel der Zeit:
Den umgekehrten Weg sein wird:
Integer = 4 bytes = 4 chars. Also konvertieren von integer zu char * Sie können einfach schreiben:
Konvertieren es zurück:
st[4] = '\0';
den Fall, dass jemand will, um print den string?#define FourCC2Str(code) (char[5]){(code >> 24) & 0xFF, (code >> 16) & 0xFF, (code >> 8) & 0xFF, code & 0xFF, 0}
Schrieb ich diese C-Funktion für meine audio-code ... es ist vielleicht ein bisschen naiv, aber es macht den job gut genug für mich:
Schlage ich vor, mit einer Funktion wie folgt:
Dadurch wird sichergestellt, dass Sie nicht am Ende mit einige zufällige Ergebnisse für einige FourCharCodes, die tatsächlichen zahlen wie
kCMPixelFormat_32ARGB = 32
.Fall, dass Sie die Entwicklung für macOS statt iOS, es gibt bereits eine eingebaute Funktion für diesen in Launch Services. Um die 4cc als NSString:
Mehr Swifty Umsetzung, arbeiten für den Swift 4:
Die verwendet werden können, wie folgt:
Arbeiten Swift 2.2 version zwei Erweiterungen:
Hier ist die Swift 3-version j.s.com's code aufgeräumt zu beseitigen Wiederholung:
Einer sehr einfachen version für den Mac, aber nicht iOS: