• ベストアンサー

文字列の演算

文字列の値を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

  • 1ByteのChar型変数を文字列として扱いたい

    1Byteのchar型変数に入ってる値を文字列として扱う方法を教えて下さい Char a; a=30; この30を文字列として出力したいのです 期待している出力:30 判る方、よろしくお願いします

  • シフトJIS 2バイト字の範囲

    シフトJISの2バイト文字の範囲は 0x40~0x7e と 0x80~0xfc と 0x40~0xfc のどっちですか? どちらの情報も見たことがあるんです。 シフトJISの文字をマッチングさせる場合、 ここでは見やすく、スペースを入れて / [\x81-\x9f] [\x40-\xfc] | [\xe0-\xfc] [\x40-\xfc] / とした場合、例えば、亜a という文字列があったら 亜 の2バイト目(下位ニブルっていうのかな)が 9F で b は16進で 62 だから、亜 の2バイト目と a が、 2バイトのシフトJISとしてこれにマッチしてしまうんです。 シフトJISで、こういう例外処理を書かずに、 全てに適用できるシフトJIS2バイトマッチのソースが あれば教えてください。

    • ベストアンサー
    • CGI
  • 文字列の置換についての質問です。

    ASPにて文字列変数で最後の文字がある文字だったら違う文字に変換したいのですが、 どのような記述をすればよろしいのでしょうか? 具体的には変数strSの最後の文字が「A」だったら「X」に したいと思っています。 どうぞよろしくお願い致します。

  • 文字列の操作

    こんにちは。 以下のような、文字列があるとします。 NUMBER1(ヌル\0)からNUMBER1000(ヌル\0)までの文字列があるとします。 NUMBERは付属で、ほしい文字列が1から1000までNUMBERの次にある場合、1から1000までを取得する方法として、 Buf[100] int x=0; while(Buf[x]!='\0') //ナル文字までの長さを取得 x++; memmove(&Buf[0],Buf[x-1],4); //NUMBER1の場合、長さは7。しかしほしい文字列は第6要素なのでx-1。 しかし・・・これを行うと、 NUMBER10:長さ8 NUMBER100:長さ9 ・ ・ となり、二桁以上の場合は、memmove(&Buf[0],Buf[x-2],4)と、 第2引数を手動で可変しなければなりません。 そこで、NUMBER\01\0 NUMBER\01000\0というように、 NUMBERの次にヌル文字(あってますでしょうか?)\0を挿入し、次の要素に1から1000まで文字列を挿入。そして文字列終端が分かるように再度\0を挿入します。 しかしこのような場合、ヌルを2つ挿入することで、上記に示したプログラムでは、手前の\0までしか長さを取得しないので、うまくいきません。 そこで、文字列の区切りを示すための方法として、なにかありますでしょうか? 文字列は最後に、\0を挿入することで判別すると書いてありますが、 NUMBERVISUALC++\0というような文字列を配列に格納してある場合、 NUMBERとVISUALC++をどのように分けて取得するのでしょうか? それとも、第6要素から取得した文字列があると言う事が分かっている場合、第6要素からを指定するプログラムを作るということになるのでしょうか? よろしくお願いします。

  • 特定の文字列を抜き出す。

    javaでrdfファイルへのURLを抜き出そうと思っています。 具体的にはhttp:からindex.rdfという文字列を 抜き出したいのですが、 String型のlineという変数に a.(http:*************index.rdf)だけ含まれている文字列と b(http:*********foaf.rdf ***************** http:***************index.rdf) のような含まれ方をしている文字列があります。 aの場合はsubstringメソッドを使って httpの現れる場所からindex.rdfが現れる場所をindexOfメソッドで求めて抜き出せばよいのですが、 bの場合最初のhttpから最後のindex.rdfまで読み出されます。 index.rdfのついたhttpから文字列を抜き出す方法は ないでしょうか?お願いします。

    • ベストアンサー
    • Java
  • A列とC列に数字、B列に文字列が下記の通り配置されています。A列の番号

    A列とC列に数字、B列に文字列が下記の通り配置されています。A列の番号の小さいものが”親”、番号の大きいものが”子”の様な関係(1が親、3が子、6が孫の関係)にある配置が有る場合に、D列に自分の親の文字列、E列にC列の値を元に値(子供は親×子、孫は親×子×孫の関係)を設定したい場合、どの様な方法で対応すればよいでしょうか? A列   B列   C列   D列   E列 1   文字A   3          3 3   文字B   2   文字A   6 6   文字C   2   文字B   12 1   文字D   1          1 3   文字E   2   文字D   2 6   文字F   2   文字E   4 3   文字G   1   文字D   1 6   文字H   1   文字G   1

  • 文字列中からある文字列とある文字列の間にある文字列を取得

    表題にあるとおり間の文字列をどうやって取得するべきかと悩んでいます・・ abcdefghijklmn・・・ となっているとき bとe、aとkなど間の間隔が不定なときはどのようにして文字列を取得したらよいのでしょうか? 最初の2文字は与えられているとして考えています。 インターネットのURLで言うなら/から/までの間の文字列と言うことになります。 今私が考えているのは strchrで位置のアドレスを取得してそこからfor文かwhile文で指定の2文字目が出るまでまわすのかなぁ・・と思っています。 ですが具体的にどのような感じに書けばいいのかがわかりません。どなたかご教授ください。

  • 文字列の取得

    string.subString()のなどで文字列を指定文字数分取得する場合に、バイト数指定で取得する方法ってありますか? 教えてください。

    • ベストアンサー
    • Java
  • 文字列検索で・・・

    Instr関数で文字列の存在チェックを行っています。 この場合、変数indexに1が入った場合 Instr("aaa1_a.sql","index") <----- この場合問題はないのですが、 Instr("aaa12_a.sql","index") <-----となる場合も値がとれてしまうので どうしたものかと困っています。 うまく検索させる方法はないでしょうか? ちなみに検索する文字列には aaa数字.sql aaa数字_a.sql aaa数字_b.sql というパターンがあります。 どなたかよきアドバイスをいただけませんでしょうか? よろしくお願い致します。

  • エクセル 文字列連結演算子で文字列を結合

    文字列連結演算子の「&」 を使って文字列を結合し、その間に()を投入したいです。 A列   B列  C列        D列 高橋太郎 東京  文字連結演算子  高橋太郎(東京) C列 =A1&(B1) ではエラーがでます。正しい書式を教えてください。 A列    B列  C列   D列  E列        F列 高橋太郎 (    東京   )  文字連結演算子   高橋太郎(東京) E列 =A1&B1&C1&D1 ってのは分かるのですが、もっとスッキリするものはないでしょうか? 宜しくお願いします。