1

インターネットで次のコードを見つけました。これは、NSString表現などを
@"00F04100002712"実際のバイト配列に変換します。コードは機能し、正しい出力を生成します。コードでは最初の 2 つの位置のみが使用されているため、char byte_chars[3]代わりにある理由がわかりません。char byte_chars[2]

void hexStringToBytes(NSString *s, NSMutableData *data)
{
    unsigned char whole_byte;
    char byte_chars[3] = {'\0','\0','\0'};
    int commandLength = (int)[s length];

    // convert hex values to bytes
    for (int i=0; i < commandLength/2; i++)
    {
        byte_chars[0] = [s characterAtIndex:i*2];
        byte_chars[1] = [s characterAtIndex:i*2+1];
        whole_byte = strtol(byte_chars, NULL, 16);
        [data appendBytes:&whole_byte length:1];
    }
}

strtol関数呼び出しと関係があると思いますが、何が原因かわかりません。

誰かがこれがどのように、そしてなぜ機能するのか説明できますか?

4

5 に答える 5

4

C スタイルの文字列には、終端のゼロ (別名 null) 文字があります。16 進数での 8 ビット バイトの ASCII 表現は、2 文字にそのターミネータを加えたものになります。

于 2013-01-27T05:48:41.223 に答える
2

はい、そうです。strtol は「文字列」を期待しています。C では文字列は null で終了します。したがって、ヌルの余分なバイト。

于 2013-01-27T05:48:53.357 に答える
1

C 文字列は NULL (0) で終了する必要があります。これは、NULL で終了する文字列を期待する関数で C 文字列を使用しているため、文字配列には NULL 用のスペースが必要です。

于 2013-01-27T05:48:54.623 に答える
0

あなたはC、C ++、Objective-Cにめちゃくちゃです。

C ++とObj-cは、配列をフルに活用しています。C ++は、サイズ+ NULL('\ 0')用の追加の1スペースの配列を作成します。Obj-cには単なるポインタであるNSStringクラスがあるため、NULLは必要ありません。

Cでは、文字の配列をNULL('\ 0)で終了する必要があり、最後のスペースは割り当てられたサイズから使用されます。したがって、書くchar str[10];場合は9文字を使用でき、最後の文字は自動的にNULLになります。

strtolを使用しているコードスニペットでは、これはC-char-arrayを期待するC関数です。最後のスペースは明示的に使用されていません。NULLがその場所を占めています。

于 2013-01-27T06:16:07.343 に答える
0

C 文字列は NUL (0) で終了する必要があります。strtol 関数の呼び出しはそれを期待しています。

于 2013-01-27T05:51:56.083 に答える