BYTEについて―

このQ&Aのポイント
  • データの受渡しについて、LPBYTE型からBYTE*型に代入する場合の問題点と正しいやり方について解説します。
  • LPBYTEとBYTE*の違いやLPBYTEの管理方法について詳しく解説します。
  • BYTE配列の宣言・定義・使い方について、newとdeleteの使用方法や他の定義方法について解説します。
回答を見る
  • ベストアンサー

BYTEについて―

BYTEについて― わからない事がいろいろと有るのですが、 【1.データの受渡しについて。】 LPBYTE型に入っている32bitのBMP画像(pixel)を BYTE*型(pbyte)に代入する場合 pbyte = (BYTE*)pixel; このコードで問題ないのでしょうか? また、用意した受け皿のサイズを超えたデータを入れた場合、 配列の末尾に\0が入って残りは切り捨てられているのでしょうか? そして、これは正常に動作するやり方なのでしょうか? 【2.LPとは?】 LPBYTEはBYTEのポインタ型と聞きますが、 BYTE*とどう用法が違うのでしょうか?(LPシリーズ全般の疑問ですが) また、LPBYTEもやはり、末尾に\0が入って管理されているのでしょうか? 【3.宣言・定義・使い方について。】 現在、 BYTE* pbyte = new BYTE[10240]; 等と書いてBYTE配列を作っているのですが、 これは宣言と同時に定義している事になるのでしょうか? そして、newしている以上、手動でdeleteしなければならないのですよね? また、これ以外の定義方法も有るのでしょうか? 質問が多岐に渡っていてすいません、 どうも普通の配列と混同しているのか、 頭の中で疑問がグルグル回ってしまっていまして; よろしくお願いします。 っ;_ _)っ

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

  • ベストアンサー
noname#208124
noname#208124
回答No.1

現在では *BYTE PBYTE LPBYTE に違いはありません DOSや16ビットWindowsの頃の名残ですので、今は区別する必要は全くありません http://jet2.u-abel.net/program/win16/extraptr.htm 1バイトごとに使うのにtypedef unsigned charがちょうどよかったと言うだけで文字列として扱っているわけではないので末端が\0という規定はありません 1.データの受渡しについて、はポインタの理解が足りないような気がします

zaxs5968
質問者

お礼

>現在では *BYTE PBYTE LPBYTE に違いはありません >DOSや16ビットWindowsの頃の名残ですので、今は区別する必要は全くありません そうなのですか。 ありがとうございます。 >末端が\0という規定はありません そうなのですね。 >1.データの受渡しについて、はポインタの理解が足りないような気がします BYTE* pbyte = new BYTE[10240]; 等としてそのサイズを超えてアクセスするとエラーが出るからつい 実体的に捉えてしまっていましたが、 *だからポインタなのですよね・・。 サイズを決めるのは何なんだろう・・。 言葉で説明できるほどポインタを理解してないのも事実なので 自分なりに調べなおしてみます。 ありがとうございました。

関連するQ&A

  • BYTEの配列の扱いについて

    すみません、BYTEを初めて利用している者なのですが、 文字列の描画で BYTE* ptr = new BYTE[20480]; と宣言した中に、 GetGlyphOutline() で取得した文字の画像を、1文字ずつ &ptr[0]  &ptr[2000]  &ptr[4000]  &ptr[6000] ・・・ と2000毎に文字を入れ、書き出す時もそうしているのですが、 1文字目はキレイに描画できるのですが、2文字目以降が崩れてしまいます。 変なループが起きたり、文字毎に下に隙間が等倍で増えていく感じです。 これはBYTEの使い方を誤っていて、無理な使い方をしているのでしょうか? また、以前の質問でバイトも配列?が使えると聞いたのですが、 BYTE* ptr = new BYTE[1048 * 10]; これは BYTE* ptr = new BYTE[10480];  これと全く同じ物という意味なのでしょうか?

  • byte配列の途中から2個ずつintに移すには?

    byte配列の途中から2個ずつintに移すには? Byte[] recvData={02:03:04:05:06:01:00:02:00:FF:FF:05} int nCount; =3;//データn個ください。 List<int> ValueList = new List<int>();//格納用 for (int i = 0; i < nCount; i++) {   //[0]~[4]までヘッダ+サブヘッダ。データは[5]から2byteずつ ValueList.Add(recvData[5 + i * 2] | (recvData[6 + i * 2] << 3)); }; という感じで、溜まったbyte配列の受信データから 0001、0002、65535とデータ部分を2byteずつ取り出したいのですが もうちょっとC#なら簡潔な書き方ってあるのでしょうか?

  • GetGlyphOutline() 等で「文字列」を書き出す方法を・・

    ゲーム開発で、キャラクターやモンスターの名前を表示したく GetGlyphOutline() という関数を知りそれを使ってみているのですが、 文字の画像を取得した BYTE 形式のデータを vector にpush_back したまでは良かったのですが、 1つの BYTE* の受け皿にvectorから流し込んで描画していたのですが、 メモリに書き出す都合で、1ピクセル?ごとに全部の描画する文字を グルグルと何度も何度も vector から流し込んでしまっています。 BYTE *aaa = vectorAAA[i];  //vectorから流し込む xxx = aaa[b + c * d] / 2;  //xxxがメモリに書き込まれる値 //// 中の数式はテキトウです。 これをどうにかしたいのですが、 BYTE は扱うのが始めてで、配列には出来ないとだけしか判っておらず、 まだ vector も最低限の使い方(.size()等)を覚えたばかりなのですが、 vector に入った BYTE* のデータを直接扱う方法は有りますでしょうか? それとも文字数を制限して、先に BYTE* の受け皿をどっさり並べるとか、 もっと他の手段を探すべきなのでしょうか? どうか、よろしくお願いします っ_ _)っ

  • binaryへのbyte配列の入れ方

    私は現在データベースの勉強をしている学生です。 開発環境はJDBCを使い、SQLiteにデータを入れています。 最終的には画像データ(byte)をデータベースに中に入れようと思っているのですが、まずは手始めに数字を、binaryで宣言したデータベースの中に入れたのですが、おもうような結果が得られず困っています。 具体的にソースで説明させていただくと、 String sql1 = "create table Pointing (B binary)"; statement.executeUpdate(sql1); byte[] b = new byte[2]; b[0] = 3; b[1] = 2; String sql2 = "insert into Pointing values(" + b[0] + b[1] + )"; statement.executeUpdate(sql2); ResultSet rs2 = statement.executeQuery("select * from Pointing"); while(rs2.next()) { byte[] b2 = rs2.getBytes("B"); System.out.println("B = " + b2[0]); } この結果が51となってしまいます。 正直、入れ方や取り出し方も全部いろんなサイトから引っ張ってきたり、憶測等で書いたものなので、やり方があっているとはおもっていません。なので正しい方法を知りたく書かせていただきました。 ご回答お待ちしております。

    • ベストアンサー
    • MySQL
  • int配列をbyte配列に変換

    MIDPアプリを作成している初心者です。 Image データを一旦端末のレコードストアに保存しておく為、 getRGB()で取得したint配列を、byte配列に変換しなくてはいけません。 ↓のように レコードストアに書き込むメソッドを書いてみました。 public void writeRecordStore( String name, Image image ) {     int width = image.getWidth();     int height = image.getHeight();     int[] pxData = new int[ width*height ];     byte[] byteData;     RecordStore rs = null;     try {         //画像をバイトデータに変換         image.getRGB( pxData, 0, width, 0, 0, width, height );         //レコードストアを開く         rs = RecordStore.openRecordStore( name, true );         //バイト配列に変換 ← ここがわからない                  //レコードの追加         rs.addRecord( byteData, 0, byteData.length );              } catch( Exception e ) {     } } int配列をbyte配列に変換する方法わかる方 ご教授の程お願いします。 また、まだコーディングに自信が無いので、文法のミスもご指摘頂けたらありがたいです。

    • ベストアンサー
    • Java
  • byte配列→float型の値を読みlongに変換

    UTF-8 encodingで書かれたテキスト分とfloat型 (IEEE-754/octet-stream)で書かれたバイナリ分混ざったファイルがあります。そのファイルをdataInputStreamを使って読んで、byte配列に保存されています。 FileInputStream fis = new FileInputStream(ファイル); DataInputStream dis = new DataInputStream(fis); byte[] bs = new byte[適切なサイズ]; //読み込み dis.read(bs); byte配列「bs」のindex 0 から 5までテキスト情報(XML式のヘッダー情報)あると仮定します。 UTF-8の分は for loop で "new String(bs, loop index, 1, "ASCII")"すると読み取れます。 問題は以下: index 6 から 17まではfloat型のバイナリデータ保存されているとします。 たとえば、index 6 から 順番に以下のHex string があります。 01 2A 5F 4E   B4 F2 45 4E   92 6A 5F 4E (4つのグループにしたのは分かりやすくするため) 上記float型のHex String をlong intに変換して、別途用意された配列に保存したい。 ネット検索でByteBufferにwrapメソッドを使って、getFloat(index) 又は getFloat()でfloat型取得できると書いていますがその先はどうやってlong int変換できるのでしょうか? 上記のHex string の変換後の値(取扱いしたい値)は19554126, 3035776334, 2456444750です。 今までのコード: long [] data = new long [既知のサイズ]; ByteBuffer b = ByteBuffer.wrap(bs).order(ByteOrder.LITTLE_ENDIAN); //なんらかのloop 又は ByteBuffer b の最後まで読める仕組み(remainingというメソッド?){ Float f = b.getFloat(); 又は Float f = b.getFloat(loop index); data[index] = fの longに変換した値 // つまり 19554126, 3035776334 .... } ネットで探していますが、やり方まだわからない。 どなたか、教えてください。 よろしくお願いします。

  • Java(JDK1.6)のbyte配列をそのままpostgresqlに

    Java(JDK1.6)のbyte配列をそのままpostgresqlに保存したいのですが上手くいかず困っております。 (詳細) DBのカラム数はかなり多く、その中の1つのデータがbyte配列データになっておりJava上で動かしているデータをそのままそっくり保存したいと思うのですが上手に動作しません。方法は(1)カラムが多いのでbyte配列以外をsql命令で保存(2)その後にbyte配列部分をResultSetを利用して追加する です。 [プログラム] 下記の場合はdataカラムにbyte配列を保存する形です。dataカラム以外のカラムにまずINSERTで保存してその後に追加でdataに保存、という形になります。細かいプログラムは全て省略しております。 ResultSet rs = null; Connection con = DriverManager.getConnection(....); Statement stmt = con.createStatement(); String sql = "INSERT INTO ~"; stmt.executeUpdate(sql); // ここでdataカラム以外にデータをDBに保存。dataカラムにはnullが入っている。 rs.close(); stmt.close(); stmt = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE); sql = "SELECT data FROM ~ WHERE id..."; // プライマリキーidを使って保存したデータを引っ張ってくる rs = stmt.executeQuery(sql); if(rs.next()){ Blob blob = rs.getBlob("data"); if(blob == null){ blob = con.createBlob(); // ※ } blob.setBytes(1,bytearray); rs.updateBlob("data",blob); rs.updateRow(); } 上記のプログラムで試したところ、次のようなエラーが発生します。 ※の部分で error=org.postgresql.util.PSQLException: Method org.postgresql.jdbc4.Jdbc4Connection.createBlob() is not yet implemented. というエラーが発生します。またcreateBlob()をしない場合は下の部分でNullPointerExceptionが発生します。 そこでエラーの内容からクラス宣言時にimplements Connectionと追加するとConnectionインターフェースのメソッド(たくさん)が自動追加されます。その中にcreateBlob()という命令もあるのですが、使い方が分かりません。 [参考にしたHP] http://idocsq.net/page/446 解決方法が分からず困っております。 Blobを使わないでもbyte配列がそのままDBに保存できれば構いません。ResultSet.updateBytesという命令もあって試してみたのですがうまくいきませんでした。 詳しい方居られましたら御助言頂けませんでしょうか。

  • 大きいバイトの宣言の仕方

    サーバ側からクライアント側へ ファイルを転送したいと考えています。 UserModeLinuxのルートファイルシステム(4294971392バイト)を送信するのですが、 宣言の部分で 「byte[] data = new byte[4294971392]」 で宣言すると 「型intのリテラル4294971392は範囲外です」 というエラーが出てしまいます。 どのように宣言すればよいでしょうか。

    • ベストアンサー
    • Java
  • c# 配列変数の宣言について

    c#の配列変数の宣言についてですが、 以下の2つの宣言は同じことなのでしょうか。 (1)int[] num = {1,2,3}; (2)int[] num = new int{1,2,3}; 本では(2)のような定義していますが何かルールのようなものがあるのでしょうか。 宜しくお願いします。

  • VBのByte配列をVARIANTに格納してCOMでVCに渡したい

    OS: WinXP sp2 開発: VB6 sp5 <--> VC6 sp5 MFC OCX いままでVB/VC間のデータのやりとりをStringで行っていたアプリがありまして、現在はVB側から見たインターフェースをByte()へ変更する作業を行っています。 まず VB --> VC に関して質問ですが Dim byteStream(5) As Byte byteStream(0) = 1 byteStream(1) = 2 byteStream(2) = 3 byteStream(3) = 4 byteStream(4) = 5 などとし、メソッドに対してbyteStreamをVariantで渡してやって C側から const VARIANT FAR& で参照してきて、 この.pcVal(配列の先頭アドレスが入っているはず)をchar*で受け取ろうと思いました。 するとこのアドレスには、先頭のbyteStream(0)の値しか入ってきません。 VB側でVariant = Byte()とするときに値渡しになっているっぽい?のですが、仕組みがわかりません。 この理由が知りたいです。 ODLファイルを変更して対処すべきかもしれませんが、MFCのウィザードが「慎重に行ってください。」とコメントしているので質問させていただきました。 VB側でのメソッドの宣言: Function SendVariantStream(stream, length As Integer) As Boolean odlファイルでの宣言: boolean SendVariantStream(VARIANT stream, short length) VCの宣言: BOOL SendVariantStream(const VARIANT FAR& stream, short length);

専門家に質問してみよう