C言語で72bit列の乱数を発生させるプログラムを教えてください。中途半端なbit数なのでどう発生させるか?bit数をどう格納するかが分かりません。

回答の条件
  • 1人2回まで
  • 登録:2008/04/11 10:06:09
  • 終了:2008/04/16 09:33:49

回答(5件)

id:hissssa No.1

hissssa回答回数423ベストアンサー獲得回数1272008/04/11 10:45:09

ポイント15pt

発生の方ですが、とりあえず72bit長の乱数が出来ればいいのなら、通常の15bitの乱数を5回作成して適当にシフト・マスクすればいいのではないでしょうか。イメージ的にはこんな感じで。

( rand() | (rand()<<15) | (rand()<<30) | (rand()<<45)| (rand()<<60) ) & 0xffffffffffffffffff

もちろん、この式をそのまま記述は出来ません。C言語で72bitの整数をそのまま処理するのは不可能なので、何らかの格納方法を考えなければいけません(char配列に8bitずつ格納するとか)。その乱数をどう利用するかが決まれば格納方法も見えてくるとは思います。

id:labtest

ありがとうございます。

乱数は文字列にして利用したいと思っています。この72bitをどのように文字列に変更できますでしょうか?

2008/04/11 10:59:31
id:ken33jp No.2

ken33jp回答回数928ベストアンサー獲得回数132008/04/11 13:06:26

ポイント5pt

>乱数は文字列にして利用したいと思っています。この72bitをどのように文字列に変更できますでしょうか?

http://www.orchid.co.jp/computer/cschool/bin.html

2進数で表示する。

id:labtest

私の理解が正しければ、上記で紹介されているのは72bitを72桁の文字列に変更するという方法ではないでしょうか?もし私の理解が間違っていたらすみません。

そうではなくて72bitを使ってa-Z,0-9までの文字列を作りたいと思っています。

2008/04/11 14:00:34
id:GoldenDawn No.3

GoldenDawn回答回数426ベストアンサー獲得回数812008/04/11 15:34:19

ポイント30pt

単純に考えるとこんな感じかなあ。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>


int main() {
  unsigned char r72[9] ;
  char s72[18] ;
  int i ;

  srand((unsigned) time(NULL));

  for (i = 0; i < 9; ++i) r72[i] = rand() & 0xff ;

  for (i = 0; i < 9; ++i) {
	printf("%d\n", r72[i]) ;
  }

  sprintf(s72, "%0x%0x%0x%0x%0x%0x%0x%0x%0x", r72[0], r72[1], r72[2], r72[3], r72[4], r72[5], r72[6], r72[7], r72[8]) ;

  printf("%s", s72) ;
}
id:labtest

親切にコードを書いて頂きありがとうございます。私の勘違いか、私の伝え方がよくなかったか分かりませんが、私が最終的にほしいのは72bitで表現される文字列です。

s72[18]は8bitx18=144bitですよね?

r72[9]で72bitの乱数を求めつつ、なぜs72[18]に格納されているのかがよく分かりません。理由を教えてください。

2008/04/14 12:03:53
id:GoldenDawn No.4

GoldenDawn回答回数426ベストアンサー獲得回数812008/04/14 15:03:55

ポイント20pt

例えば 0xff は 1バイトに収まる数値ですが、文字列にすると 'ff' で 2文字 = 2バイト必要になるからです。

別に必要が無ければ sprintf で s72 に文字列を格納せずに printf で直接出力すれば OK です。

id:hissssa No.5

hissssa回答回数423ベストアンサー獲得回数1272008/04/14 18:46:40

ポイント30pt

どうも根本的に勘違いがあるようですね。labtestさんの言われる「72bitのデータの文字列表現」はたぶん不可能です。

一般に文字コードはバイト単位で表されますが、1バイトのデータである0~255の数値すべてに文字が割り当てられているわけではありません。いわゆる英数字を表すASCIIコードは半分の0~127までしか使用していませんし、しかもそのうち31以下の数値は制御コードに割り当てられているため対応する文字はありません。また、128以上の数値は、一般的な日本語環境では「半角カナ文字」に割り当てられています。さらにSift-JISやEUCの文字コードでは特定の数値範囲を使用して2バイト文字を表現したりします。

つまり、任意の72bitの数値を文字列化するということにつき、一般的な定義はこの世に存在しません。よって、やるとしたら自前でなんらかの「数値←→文字」の変換フォーマットを作って、それに従って文字列化するしかありません。

たとえば、文字として"0"~"9"の数字と"A"~"F"の文字を使うとします。全部で16個の文字がありますので、4bitぶんの数値と一対一に対応させる事が可能です(=16進数表現)。このルールに従って数値を文字列に変換しているのがGoldenDawnさんのサンプルです。

あるいは、文字として文字として"0"~"9"/"A"~"Z"/"a"~"z"を使うとします。これは全部で62文字になりますが、中途半端なのでさらに2文字("@"と"_"とか)を加えれば全部で64文字になり、1文字当たり6bitぶんの数値を表せることになります。このフォーマットで変換処理をでっち上げれば、12文字で72bitを表す文字列を作れることになります。


そうやって、「文字と数値を対応させるフォーマット」を適当にでっち上げて、その通りの処理を作りこむ事でしか、labtestさんの言われる「数値の文字列化」は実現できません。まぁlabtestさんの意図を正確に理解できているか自信はないのですが・・・。

  • id:GoldenDawn
    文字列終端が要るから 18 じゃなくて 19 だった。
  • id:labtest
    hissssaさん

    >1バイトのデータである0~255の数値すべてに文字が割り当てられているわけではありません。

    そうだったんですね。私が完全に勘違いしてました。

    hissssaさんのご説明でGoldenDawnさんのサンプルの意味も分かりました。

    あと、どうするかは自分でとりあえず考えてみます。または別途人力検索で質問させて頂きたいと思います。

    ありがとうございました。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません