1

こんにちはすべてのiveは、文字列へのポインタを取り、各バイトを対応する暗号化文字に変更できる単純な小さな暗号化関数を作成しました。関数を実行すると、テキストがプレーンテキストに戻ります。

私の問題は、const char *p = "...";宣言された変数でこの関数を使用したいのですが、これらは実行時にメモリにロードされ、書き込みできないため、それは単純に不可能です。

これが私の機能です。

char *Cipher(char *str)
{
    char *p = str;

    while(*p)
    {
        if(*p >= ' ' && *p <= 'O')
        {
            *p = ((*p + 48) % 127);
        }
        else if(*p >= 'P' && *p <= '~')
        {
            *p = ((*p - 48) % 127);
        }

        p++;
    }
    return str;
}

文字列へのポインタを取得し、すべての文字を置き換えて、そのポインタを文字列に戻します(printfや引数として受け入れるものなどの他の関数内で使用できるようにするためchar*)。

これらのconst char*ポインタを操作するには、それらを関数のローカルメモリにコピーして変更する必要があることがわかりましたが、他の関数に渡すことができるように、新しくエンコードまたはデコードされた文字列へのポインタを返すにはどうすればよいですか。(最終的な目標は、それを単純なチャットプログラムに含めることであり、私はそれを次のようなものと呼びたいと思いますsend(sock, Cipher(PRE_HEADER), strlen(PRE_HEADER));)また、これを行う方法はスレッドセーフではないと思います。アプリケーションどのような変更を加える必要がありますか?

単純な文字列換字式暗号の他の代替コードも受け入れています。

どんな助けでもいただければ幸いです。ありがとうございました。

4

3 に答える 3

0

あなたは使用する必要があります

strncpy( str, All.c_str(), sizeof( str ) );

いくつかのヘルパー関数で、またはへの呼び出しの直前

send(sock, Cipher(PRE_HEADER), strlen(PRE_HEADER));
于 2013-03-14T03:52:46.733 に答える
0

変数をポインタでcharはなく配列として宣言してみてください。char

char p[] = "...";

以前とほぼ同じ効果があります—p関数に渡すことができ、ポインタにうまく減衰します—しかし、読み取り専用メモリに格納される代わりに、p宣言された場所(内部のスタックのいずれかに)に格納されます関数、または静的にする場合は、プログラムのデータセグメント内)。

于 2013-03-14T04:03:44.437 に答える
0

Cipher関数内で文字列を複製して操作しstrdup、新しい文字列のポインタを返すことができます。

何かのようなもの:

char *Cipher(char *str)
{
    char *new_string = strdup(str);
    char *p = new_string;

    while(*p)
    {
        if(*p >= ' ' && *p <= 'O')
        {
            *p = ((*p + 48) % 127);
        }
        else if(*p >= 'P' && *p <= '~')
        {
            *p = ((*p - 48) % 127);
        }

        p++;
    }
    /* return new_string not p */
    return new_string;
}

また、関数で新しい文字列を使用するには、呼び出し元のコードを次のように変更する必要がありstrlenます。ただし、渡される文字列の長さが常に戻り文字列と同じになることが本当にわかっている場合は、を使用できCipherます。strlen(PRE_HEADER)

str = Cipher(PRE_HEADER);
send(sock, str, strlen(str));
于 2013-03-14T04:04:11.330 に答える