• ベストアンサー

1バイトデータの扱い方

IPアドレスを4バイトのデータとして扱おうと思ったのですが、 どうしたら良いのか方法がわかりません。 Cなら、 int IPData1=255; char chIP[4]; chIP[0]=(char)IPData1; というような感じだと思うのですが、PHPではどうしたらよいのでしょうか。

  • PHP
  • 回答数4
  • ありがとう数4

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

  • ベストアンサー
  • shimix
  • ベストアンサー率54% (865/1590)
回答No.3

たびたびすみません。typoに気付いて慌ててしまいました。 分解するときは   $ipw1 = ord(substr($ipx,0,1)); などとして数値で得ないといけませんでしたね。

pokapoka1980
質問者

お礼

返信、感謝です。 ありがとうございました。

その他の回答 (3)

  • tols
  • ベストアンサー率46% (7/15)
回答No.4

論理演算でシフトとアンドを駆使すれば同じ動作をします。 でも、はたして必要なのかはわかりません…。

pokapoka1980
質問者

お礼

PHPは、32ビットまでシフトできるんですね。 ただ、シフト先のバッファサイズがわからないので、なんか不安です。 返信、ありがとうございました。

  • shimix
  • ベストアンサー率54% (865/1590)
回答No.2

ANo.1です。charはtypoです(当然chrですね) 参考までに書いてみました。   $ip1 = 65;   $ip2 = 66;   $ip3 = 67;   $ip4 = 68;   # 結合   $ipx = chr($ip1) . chr($ip2) . chr($ip3) . chr($ip4);   # 分解   $ipw1 = substr($ipx,0,1);   $ipw2 = substr($ipx,1,1);   $ipw3 = substr($ipx,2,1);   $ipw4 = substr($ipx,3,1); #「.」で区切っておいて、explodeで切り出す方がはるかに楽ですね・・

  • shimix
  • ベストアンサー率54% (865/1590)
回答No.1

とりあえずはchar()やord()を使えば数字と1バイトの文字の相互変換は可能です。   http://www.php.net/manual/ja/function.chr.php   http://www.php.net/manual/ja/function.ord.php あとは文字列を単純に連結したり、切り取ったりするだけです。 #ただ、phpでそういうことをすると効率悪そうですけどね(汗

関連するQ&A

  • int型(2バイト)データの分割

    int型(2バイト)データの分割 マイコンのフラッシュ領域にint型のデータ(2バイト)を 1バイトづつ書き込むのに以下のコードを考えています。 unsigned int data; unsigned char dat1,dat2; data = 555; dat1 = 0; dat2 = 0; dat1 = (char)data; dat2 = (char)data >> 8; 以下、dat1とdat2をフラッシュに書き込む。 未熟者でプログラムとして合っているのか解りません。 やり方として問題ないでしょうか? またもっと良い方法があればご教授願います。

  • データ型だけを取得したい

    あるテーブルから、CREATE TABLE使用時に設定したデータ型のみを取得する方法を教えてください。 たとえば、「INT,TEXT,CHAR...」など。 最終的にはPHPで配列として取得したいのです。

    • ベストアンサー
    • MySQL
  • 異なる構造体のデータのコピー

    (1)で受け取った構造体のメンバのデータを (2)の構造体のメンバにコピーしたいと考えています。 (1) typedef struct _recvData{ int data01; int data02; char data03; char data 04; char data05; char data 06; char data07; char data08; char data09; char data10; char array01[16]; char array02[16]; } recvData; (2) typedef struct _sendData{ int header; int data01; int data02; char data03; char data 04; char data05; char data 06; char data07; char data08; char data09; char data10; int array01[4]; int array02[4]; } sendData; そこで2点ほどおしえていただきたく、お願い致します。 (1)構造体が微妙に異なるため、各メンバ変数に値をそれぞれ代入していくしか方法がないのでしょうか? (2)array01, array02はデータの型が異なる場合、データのコピーはどのようにしたらよいでしょうか?

  • long型のデータをバイト型の配列に代入する方法

    long型のデータを配列を使って1byte毎に分けたい処理を作りたいのですが、 やりかたとしてはlong型のアドレスをポインタ変数に渡して、 ポインタ変数をバイト配列に代入する方法になりますでしょうか? 具体的なプログラムはこんな感じと考えてますが unsigned long LONG: unsigned char AAA[8], *pon, i: pon = &LONG for(i=0 i<8 i++) { AAA[i] = *pon + i; } C言語に詳しい方教えてください、よろしくお願いします。

  • 2バイトの文字データの送信

    今2バイト分のデータを送信しようと思っているのですが、なかなかうまくいきません。どうしたらいいのでしょうか? (出きればソースを載せていただきたいです。) お願いします。 sample(一部) //送信 SOCKET sTest; char data[2] = 2; for(i=0;i<10;i++){ send(sTest,data,sizeof(data),0); } //受信 #define SIZE 256 SOCKET sTest; int hrecv; char data[SIZE]; while(1){ recv(sTest,data,SIZE,0); if(hrecv == 0){ colsesocket(sTest); break; } }

  • 第7ビットが0の4バイト分計算

    お世話になります。ID3v2の仕様で、タグ部分のサイズを表す数字が 「第7ビットがすべて0になるようにエンコードされた4バイトのデータ であり、第7ビットは無視するため全部で28ビット」 なので、例をあげると、 0x00000201 → 257(普通は513) となります。これをファイルから読み込む時、どのようにして読み込んだらいいでしょうか。 1バイトずつcharに入れて、128の重み(普通は256)を付けて計算したら良いかと思いましたが、試しに //cに1バイト読み込んだと仮定 char c = 0xAC; unsigned int i = 0; i += c; とすると、iが -84 になってしまいました。(172になって欲しかった) 聞きたいことは以下の2つです。 1.第7ビットを無視するデータを4バイト分読み込んで、整数にするにはどうしたらいいのか 2.もしくは、ファイルから1バイトずつ読み込んで整数にするにはどうすればいいのか です。何か分かり難い文章ですが、よろしくお願いしますm(__)m

  • 1バイトデータの読み出しについて

    こんばんは。 すみません。文字操作?ポインタ操作が苦手なので教えてください。 以下のような構造体があり、その構造体から1バイトずつ読み出して 自作の関数のパラメータ(1バイト指定領域)に渡したいのですが、 構造体から1バイトずつデータを読み出すには、どのようにすればいいのでしょうか? typedef struct { PACKET_HEADER head; unsigned char Sp_Pr_St[1]; unsigned char ctrl_flow[1]; unsigned char product_org[10]; unsigned char product_name[10]; unsigned char product_ver[3]; }PRODUCT_RESPONS; typedef struct { unsigned char head; unsigned char type; unsigned char data_len; } HEADER; どうぞよろしくお願いします。

  • waveファイルの8bitデータの調整

    VS2003.NET/C++でプログラミングをしています。 今、WAVEファイルで音声データを取って、フェードを掛けようと思うのですが、8bitだと上手くいきません。  16bitの場合は、2byte分読み込み、それから小数で割っているんですが、8bitの場合、1byteに左チャネル、2byte目には右チャンネルといった形で格納されているはずなんですがそのようにしても上手くいきません。  上手くいった16bitデータの音量調整を下記に載せておきます。 8bitにするにはどうしたらいいでしょうか? int nMeter; <- 音量を100分割で表す int nSize; <- データのサイズ LPBYTE lpData1; <- 相手の音声 LPBYTE lpData2; <- 音声を加工 // サイズ分を加工 for( int i = 0; i < nSize; i+=2 ) { // 16bit なので 2BYTEずつ確保 char n1 = (char)( lpData1[ i + 0 ] ); char n2 = (char)( lpData1[ i + 1 ] ); // nMeter で音量調整(倍率をかける) int n = (int)( (float)( ( n2 << 8 ) | ( n1 & 0xFF ) ) * (float)( nMeter / 100.0f ) ); // 加工済みデータを保存 lpData2[ i + 0 ] = ( n & 0x00FF ) >> 0; lpData2[ i + 1 ] = ( n & 0xFF00 ) >> 8; } 上手くいってない8bit版は次の通りです int nMeter; <- 音量を100分割で表す int nSize; <- データのサイズ LPBYTE lpData1; <- 相手の音声 LPBYTE lpData2; <- 音声を加工 // サイズ分を加工 for( int i = 0; i < nSize; i+=4 ) { // 16bit なので 2BYTEずつ確保 char n1 = (char)( lpData1[ i + 0 ] ); char n2 = (char)( lpData1[ i + 1 ] ); n1 -= 128; n1 * (int)(bMeter / 100.0); n2 * (int)(bMeter / 100.0); n1 += 128; n2 += 128; // 加工済みデータを保存 lpData2[ i + 0 ] = n1; lpData2[ i + 1 ] = n2; } よろしくお願いします。

  • C言語 ファイル内のデータと入力したデータの重複

    テキストファイルを読み込み、入力したデータとの重複がないかどうかを調べたいのですが、 わからない点があるため、質問させていただきます。 -------------------------------------------------------- #include <stdio.h> #include <stdlib.h> #include <string.h> int main() {    FILE *fp;    char datafile[];= "sample.txt";    char buff[512]; //読み込んだ1行分のデータを格納    char *data[1000]; //読み込んだデータを格納    int data_c = 0; //データの数    char str[256]; //入力された文字列を格納    int i;    int check; //重複チェック         (中略)    //ファイルを1行ずつ読み込み、その長さのメモリを確保し、値をコピー    while(fgets(buff, sizeof buff, fp) != NULL) {      data[data_c] = (char*)malloc(strlen(buff) + 1);      strcpy(data[data_c++], buff);    }         (中略)    //文字列を入力    fgets(str, 256, stdin);    check = 0;    //すでにあるデータと入力したデータの重複を調べる    for(i=0; i<data_c; i++) {      if(strcmp(data[i], str) == 0) {      check = 1;      break;      }    }         (中略) -------------------------------------------------------- 例えば読み込むファイルに5行書かれていた場合、 data[0]からdata[4]に確保したメモリの先頭アドレスが格納されますよね? ということはdata_cの値は4となるのですが、 その後のファイルデータと入力したデータの重複を調べるところで、 for(i=0; i<data_c; i++) となっており、data[0]からdata[3]までの4行分しか調べられないことになります。 なぜ、i<=data_cではなく、i<data_cとなっているのか、わかりましたら教えていただけますでしょうか。

  • int型ポインタの加算

    void foo() {   int *ptrInt=0;   char *ptrChar=0;   ptrInt++;   ptrChar++; } Windows2000上で、上記を実行すると ptrIntは4になります。 ptrCharは1になります。 なぜでしょうか。 32ビットとはいえ、 ptrIntとptrCharはアドレスを示しますよね。 アドレスに1加算するのだから、 int型、char型に関係なく、 いずれも1になるべきだと思います。 int型のポインタの場合示すデータは4バイトなので、 ポインタ1加算は、4(バイト)加算になるということでしょうか。