68user's page 掲示板

Prev< No. 1573〜1576> Next  [最新発言に戻る] [過去ログ一覧]
No. 1573 # CoreFighter 2001/01/15 (月) 23:08:50
        char TempBuf[10+5+5+5+5+1];

        /* TempBufを初期化 */
        memset(TempBuf, 0x00, sizeof(TempBuf));
        /* TempBufに設定 */
        sprintf(TempBuf, "%d%d%d%d%d",
                tes_s.test_1, tes_s.test_2, tes_s.test_3, tes_s.test_4, tes_s.test_5);

この時TempmBufの大きさは
longを整数にした時の最大桁数 + shortを整数にした時の最大桁数
shortを整数にした時の最大桁数 + shortを整数にした時の最大桁数
shortを整数にした時の最大桁数 + 改行(\r)
です。

No. 1574 # CoreFighter 2001/01/15 (月) 23:21:24
すいません。訂正です。
>この時TempmBufの大きさは
>longを整数にした時の最大桁数 + shortを整数にした時の最大桁数 +
>shortを整数にした時の最大桁数 + shortを整数にした時の最大桁数 +
>shortを整数にした時の最大桁数 + 改行(\r)
>です。
改行(\r)でなくてNULL文字(\0)でした。

No. 1575 # gixs 2001/01/16 (火) 03:00:49
> sprintf(TempBuf, "%d%d%d%d%d",
> tes_s.test_1, tes_s.test_2, tes_s.test_3, tes_s.test_4, tes_s.test_5);

この方針は、
>>1512 gixs
の最後で書いた、数値を文字列として渡す方法ですね。
(つまり、数値10を0x31 0x30のバイト列にしてしまう方法です)
受け手は、自前のパーサなりsscanf(3)なりで、パースして数値に戻します。

でも、"%d%d%d%d%d"ではパースできません。
ゼロ詰めで桁数を決め打ちするか、空白で区切るべきでしょう。

このように文字列で渡す方針が簡単なので、実用アプリならこうすべきですが、どうしても数値のままネットワーク上に流したいとのことなら、ネットワークバイトオーダに変換しながらmemcpy(3)(or memmove(3))します。

# 動かないコードでもいいように、疑似コード(エラー処理なし)。
# および、勝手に、uint32_t tes_s.test1; uint16_t tes_s.test2;ということにします。
char *p = buf;
uint32_t x32 = htons(tes_s.test1);
memcpy(p, &x32, sizeof(uint32_t));
p += sizeof(uint32_t);
uint16_t x16 = htons(tes_s.test2);
memcpy(p, &x16, sizeof(uint16_t));
p += sizeof(uint16_t);
...
write(sock, buf, p - buf);

受け手は、どういうbit数の数値がどう並んでいるかを知った上で、受けたバッファから数値を切り出していきます。

No. 1576 # gixs 2001/01/16 (火) 03:12:37
ひとつ訂正。
最初のhtons()はhtonl()。
# 掲示板への書き込みは難しいですね。他にもミスがあるかも。

Prev< No. 1573〜1576> Next  [最新発言に戻る] [過去ログ一覧]