• ベストアンサー

文字列の演算

文字列の値を1バイトずつ加算して、加算した値の最後の1バイトだけ、取得するというロジックを教えてください。 たとえば、 0x49 0xfc 0x31 0x9e 0x9e と変数aにはいっていた場合、 これを1バイトずつ加算する方法は・・・?

質問者が選んだベストアンサー

  • ベストアンサー
  • toysmith
  • ベストアンサー率37% (570/1525)
回答No.6

「チェックサムの算出」と考えてよいのでしょうか? だとすれば… #define MAX 文字列長 unsigned char *buf = "....................."; int cnt, sum ; for (sum = 0, cnt = 0 ; cnt < MAX ; cnt++) { sum += buf[cnt] ; } この状態で(sum & 0x00ff)に算出されます。

その他の回答 (5)

  • ranx
  • ベストアンサー率24% (357/1463)
回答No.5

補足を見てもよく分からないのですが、 そもそも「加算」というのは、ある数に別のある数を加えるわけですよね。 「1バイトずつ加算する」というのは、何に何を加えるんですか?

  • k-family
  • ベストアンサー率34% (180/523)
回答No.4

手元にCの処理系がない&Cをやるのは久しぶりなので実際に試してみてくださいね。 bytesum() { unsigned char wbuf; /*実際に値を入れるところはポインタではダメなので変数を定義する*/ char filename[]="filename"; int fd; unsigned char buf; fd=open(filename,0) /*0はreadonly*/ if(fd==-1){/*エラー処理*/} wbuf=0; do{ flg=read(fd,buf,1); /*1文字読む。読めなかったらflg=0*/ wbuf=wbuf+buf; }while (flg<>0); /*読めてる間繰り返す*/ close(fd); }/*終わり*/ こんな感じでできると思いますが、質問とちょっと違いますね。 >*wbuf = XXXXXXXXXXXXXXXXXXXXXX ; このあたりの意味がよくわかりませんが、既にbuffer[100]とかにファイルが読み込まれているのなら、こんなことでしょうか? bytesum() { int i; unsigned char *wbuf,wk; wbuf=&buffer[0] /*ポインタに配列の先頭アドレスを代入*/ wk=0 for(i=0;99;1){   wk=wk+*wbuf; /*ポインタの示しているところの値を加え*/ wbuf++; /*その後ポインタを次に進める*/ } } う~ん、Cの現役の方のサポートお願いします(^_^;)

  • k-family
  • ベストアンサー率34% (180/523)
回答No.3

unsigned char型変数に普通に加算していけばいいです。もちろんはじめはゼロでクリアしてからですが。 char型変数は1文字分しかはいりませんので、加算してオーバーフローした上位bitは捨てられていきます。ですから何もしなくても計算結果の最後の1バイトが残ります。 ----- こういう意味かな?

rariko
質問者

補足

有難うございます。 たぶん、そうなんです。 えっとやりたいことですが ファイルをバイナリエディタで見ると 0x49 0xfc 0x31 0x9e ・・・・・と見ることができますよね。 で、これを1byteずつ値を加算して 結果の1byteだけを取得したいんです。 で、ファイルを作る前にこのファイルの中味を編集してるロジックで1byteずつ 加算するっていう処理を入れたいのですが、 char *wbuf; /* ファイルの編集内容をいれる */ for( ) { *wbuf = XXXXXXXXXXXXXXXXXXXXXX ;    /* 1バイトずつ値を代入している */ wbuf++; /* ここで1byteずつ何かしらの変数にwbuffの値を加算していきたい*/ }    *wbuffのポインタ変数での値を1byteずつchar の変数に加算したい。    そのコーディング方法を教えてください。 意味わかりますでしょうか??・   

  • sha-girl
  • ベストアンサー率52% (430/816)
回答No.2

0x49 0xfc 0x31 0x9e 0x9e を 0x4a 0xfd 0x32 0x9f 0x9f を ということでよろしいでしょうか? だとするとこんなかんじかと char pls_chr (*a){  while(*a!='\0'){   (*a)++;   a++;  }  a--;  return *a; } それとも1バイトずらすということでしょうか?

  • bradpitt
  • ベストアンサー率33% (5/15)
回答No.1

質問がちょっとよくわからないです。 文字列が変数aに入るようにはなってません。>配列に入ります 文字列の値を1バイト加算する。>1バイトって8ビットのことだと思うのですが、単位がめちゃくちゃだと思います。 アドレスを移動する意味なのか数値として扱って加算したいのかコードテーブルの次の文字を表示したいのかよくわかりませんがそのうちのどれかなのでしょうね。 配列にきっちり文字が入っているのなら、最後の一文字を取るという場合は、a[4]のようにその場所を指定してchar型の変数にでも格納すれば、取得できます。 最後の一文字がわからないのなら、はじめのほうから順に見ていって、0x00(でしたっけ?NULL)の手前の文字を取得すればそれ。 本当に変数にビットが並んでいるだけなんだったら変数がintとかなんだったら、000000000FFFFのようなものをANDで計算すれば欲しいものが取れます。

関連するQ&A

専門家に質問してみよう