文字列がある場合、Objective-Cで値を16進数に変換するにはどうすればよいですか?同様に、16進文字列から文字列に変換するにはどうすればよいですか?
質問する
648 次
1 に答える
1
演習として、またそれが役立つ場合に備えて、Objective-Cでは100%合法である純粋なCでこれを行う方法を示すプログラムを作成しました。stdio.hの文字列フォーマット関数を使用して、実際の変換を行いました。
これは設定に合わせて調整できる(すべきですか?)ことに注意してください。char-> hex(たとえば、「Z」を「5a」に変換)に移動すると、渡された文字列の2倍の長さの文字列が作成され、逆の場合は半分の長さの文字列が作成されます。
このコードは、コピー/貼り付けしてからコンパイル/実行するだけで試せるように作成しました。これが私のサンプル出力です:
XCodeにCをインクルードする私のお気に入りの方法は、関数宣言を含む.hファイルを、実装を含む.cファイルとは別に作成することです。コメントを参照してください:
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
// Place these prototypes in a .h to #import from wherever you need 'em
// Do not import the .c file anywhere.
// Note: You must free() these char *s
//
// allocates space for strlen(arg) * 2 and fills
// that space with chars corresponding to the hex
// representations of the arg string
char *makeHexStringFromCharString(const char*);
//
// allocates space for about 1/2 strlen(arg)
// and fills it with the char representation
char *makeCharStringFromHexString(const char*);
// this is just sample code
int main() {
char source[256];
printf("Enter a Char string to convert to Hex:");
scanf("%s", source);
char *output = makeHexStringFromCharString(source);
printf("converted '%s' TO: %s\n\n", source, output);
free(output);
printf("Enter a Hex string to convert to Char:");
scanf("%s", source);
output = makeCharStringFromHexString(source);
printf("converted '%s' TO: %s\n\n", source, output);
free(output);
}
// Place these in a .c file (named same as .h above)
// and include it in your target's build settings
// (should happen by default if you create the file in Xcode)
char *makeHexStringFromCharString(const char*input) {
char *output = malloc(sizeof(char) * strlen(input) * 2 + 1);
int i, limit;
for(i=0, limit = strlen(input); i<limit; i++) {
sprintf(output + (i*2), "%x", input[i]);
}
output[strlen(input)*2] = '\0';
return output;
}
char *makeCharStringFromHexString(const char*input) {
char *output = malloc(sizeof(char) * (strlen(input) / 2) + 1);
char sourceSnippet[3] = {[2]='\0'};
int i, limit;
for(i=0, limit = strlen(input); i<limit; i+=2) {
sourceSnippet[0] = input[i];
sourceSnippet[1] = input[i+1];
sscanf(sourceSnippet, "%x", (int *) (output + (i/2)));
}
output[strlen(input)/2+1] = '\0';
return output;
}
于 2012-08-09T06:35:19.477 に答える