バイト配列を別名で扱う方法

このQ&Aのポイント
  • VisualBasic2008 ExpressEditionにてPLCと通信するアプリケーションを作成しています。受信したデータは、Publicなバイト配列に格納されています。
  • バイト配列の内容は、ビット単位と32ビット符号付き整数があります。ビット単位は、And演算子にて判定し32ビット符号付き整数は、BitConverter.ToInt32にて数値化して使用しています。
  • バイト配列変数を別名で参照し扱うことはできますか?たとえばDat(2)の3ビット目を"exp"と別名で宣言し、コードの中で扱いたいです。"exp"に変更を行うとバイト配列も変更されて欲しいです。上司が以前のバージョンにあったような気がすると助言してくれたので調査しています。クラス化が最も適していると思われますが、アドバイスをお願いします。
回答を見る
  • ベストアンサー

バイト配列を別名で扱う方法

VisualBasic2008 ExpressEditionにてPLCと通信するアプリケーションを作成しています。 受信したデータは、Publicなバイト配列に格納されています。 Public Dat(63) as byte 'こんな感じです 内容は、ビット単位と32ビット符号付き整数があります。 ビット単位は、And演算子にて判定し32ビット符号付き整数は、BitConverter.ToInt32にて数値化して使用しています。 この方法だとコードが煩雑で可読性が悪い状態です。 質問ですがこのバイト配列変数を別名で参照し扱う事はできますか? たとえばDat(2)の3ビット目を"exp"と別名で宣言しコードの中で扱いたいです。"exp"に変更を行うとバイト配列も変更されて欲しいです。 上司が以前のバージョンにあったような気がすると助言してくれたので調査しています。 私が調べた限りでは、見つける事ができず最も適していると思われるのはクラス化でした。 アドバイスお願い致します。

  • 11zep
  • お礼率100% (4/4)

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

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

> 以前のバージョンにあったような気がする VB6.0からやっていますが、そのような機能は知りませんねぇ…。 構造体メンバーにバイト配列をはめ込む方法はあります。VB6.0時代で使われたCopyMemoryの.NET版ですね。ただその場合でも、バイト配列と同じ内容のコピーが出来るだけで、バイト配列そのものを書き換えるとは言えず、「バイト配列→構造体(クラス)→バイト配列」という図式からは抜け出せませんね…。 (C言語であれば構造体のポインタ = Data(0)のポインタとすることで、ダイレクトに配列を構造体メンバー名で書き換えられそうですが…)

11zep
質問者

お礼

早速の回答ありがとうございます。 当の上司もうろ覚えみたいなのでおっしゃる通り存在しない可能性が高いですね。 有識者(文面から察すると)からの解答なのですっきりしました。 散々探しても見つかりませんでしたが、おっしゃる通りポインタで考えればできそうなのできっと関数などが準備されていると期待しておりました。 クラス化する方向で考えたいと思います。

関連するQ&A

  • 情報学についての質問です。

    考えても理解できなかったので教えてもらえるとうれしいです。 問 配列A,Bに正負の符号と絶対値の十進数をアスキーコードで表された値が入力されている。正負は0の時'#'、負の時は'-'で表され、続いて絶対値が一桁10進数の文字表現として代入されている。 (a)符号と絶対値がそれぞれCL,ALレジスタに与えられているとき、その値を8ビット符号付き整数としてBLレジスタに入力するsubroutinABSのフローチャートと命令コードを書く。 (b)配列A、Bの値をそれぞれ8ビット符号付き整数に変えた後、それらの和をDLレジスタに求める命令を書く。(a)のsubroutinを使う。 (c)(b)でDLレジスタに求められた8ビット符号付き整数を正負の符号と絶対値をアスキーコードで表し下の配列Cに入れる。この処理のフローチャートと命令コード書く。 DL:1111 1111B   のとき、  C: '-'、'1'  とする。 詳しい解説とともに解答していただけるとありがたく思います。お願いします。

  • エンディアン:2バイトのデータをShort intにしたいのですが?

    1.Intelの CPU リトルエンディアンでの、問題です。 バイナリファイルをバイト単位で読込み、これを16ビットの整数にしたいのですが、以下のようにコーディングしましたが、うまくいきません。解決方法をご教示下さい。 char s[2]; short int x;   // 16ビットの整数です // s[0] s[1]に、データを読み込みます。 x = (short)(s[0] + 256 * s[1]); 2.同様の問題で、ビッグエンディアンの場合は、どうすればよいかも、ご教示下さい。 よろしくお願いします。

  • 浮動小数点の問題です。

    10進数+0.375を浮動小数点で記憶させ、その記憶領域のダンプリストを読み取ると、 0.375は16進数で(1)に、 -1は16進数で(2)となる。 答えは(1)は7F00、(2)8600です。 この2つの問題の途中式と解説をお願いします。 バイト型:バイト数は1バイト,負の補数は2の補数で表す 整数型:バイト数は2バイト,負の補数は2の補数で表す 浮動小数点:バイト数は2バイト,符号1ビット,指数部5ビット,仮数部10ビット ビット番号0:符号部.仮数部の符号が入っている.0なら正,1なら負 ビット番号1-5:指数部.負の値を2の補数で表す ビット番号6-15:仮数部.ビット番号6を小数点第1位とする仮数部の小数点以下の絶対値が、正規化された2進数で入っている 正規化とは,仮数部が2進数で0.1以上1.0未満になるよう指数部を増減する操作である

  • PIC18F1320でwarningがでる

    PIC18F1320で MPLAB X IDE v3.26 XC 8です warningがでる warningがでてもプログラムは動く warningがでなくしたい LCD液晶表示装置を使うので8ビット符号なし整数型がいい 0から255の8ビット符号なし整数型しか使わない キャラクターコードをLATB(PORTB)に送るため プログラムで-1や256になったりしないよう制御してある #include <xc.h> CONFIG 省略 ほとんど省略 // EQU unsigned char TMRA=1; unsigned char TMRB=1;//など void main(void) { TMRA = TMRA - 20; TMRB = TMR+1;//など } newmain.c: warning: (xxx) conversion to shorter data type よろしくお願いします。

  • MCプロトコル 1ビットだけONしたいとき

    お疲れ様です。 現在MCプロトコル通信アプリを作成しておりましてワード単位書き込みはできております。 文字列で連結させてアスキー変換する方法ではなく、 純粋にバイト配列を作って入れ込んでSocket の Write, Read をやる方法をとっております。 MELSECプロトコルマニュアルをみたのですが、 ビット単位書き込みのときは、データ列をビット列で並べるだけ、という解釈しかできません。 たとえば1ビットだけONしたいときは、バイト配列に書き込むやりかただと、どういう値を書き込めばよいのでしょうか。 &H1 (0x01) という値を書き込んでも何もなりません。 やはり文字列連結からASCII変換して送るやりかたのほうが賢明なのでしょうか? ご教授いただければ幸いです。。

  • ビット演算で00000001と1の頭に0を付ける?

    https://www.grapecity.com/japan/powernews/column/clang/019/page02.htm ビット演算子 表1にCのビット演算子を掲げておきます。ビット演算とは言っても、扱う値はバイト単位などCの一般的な整数のデータ型です。ビット演算子は、それらの値をビット単位で計算します。 ビットシフト演算(<< >>)~2倍と1/2 例えばunsigned char型の1は、2進数では"00000001"という形のビット列(ビットパターン)になります。これを1桁左にずらす(シフトする)と"00000010"となります。ずらしてあふれた左端の0は消え、空いた右端には0が入ります。 "00000001"は10進数の「1」、"00000010"は10進数の「2」です。つまり、ビット列を左に1桁シフトすると値は2倍になるのです。 -----------------------------------------  以上ですが、C言語の、ビット演算の解説の抜粋です。ビット演算はまだ覚えたてですが、"00000001"整数1の頭にわざわざ、0を沢山 つける目的は何なのでしょうか!?  よろしくお願いします。

  • バイナリデータからの値の取得について教えてください

    今、バイナリデータから値を取りだそうとがんばっています。 しかし、うまくいかずに困っています。 困っていることは2点あります。 (1)バイナリデータにはリトルエンディアンで格納していると書いています。 まず、リトルエンディアンで書かれている場合、どのような処理を考えることが必要なのでしょうか? (2)バイナリデータには、 はじめに文字列(char)型4バイトで「RIFF]という値 次に32ビット符号なし整数で4バイトの数字、 次に4052バイトの構造体 などと収納されているようです。 このように入っているデータから値を取得するにはどのようにしたらよいのでしょうか? 全然できなくて困っています。 教えていただけないでしょうか? よろしくお願いいたします。

  • VB2005でJIS拡張漢字の各文字コードを取得する方法

    ある関数に文字列を渡して各文字コードを取得するプログラムを作成しようとしています。 基本的な文字のコードは取得できるのですが、JIS拡張漢字のほとんどが正しく取得できません。 失敗している文字は内部的に「?」(3F)となってしまいます。 例:拡張漢字のコード値(SJIS:81B2)を変換するとコード値が「3F」になってしまう。(テキストエディタなどで文字化けすると「?」に化けるのと同じなのかな?) 正しく文字コードを取得する方法をご存知の方、またヒントなどありましたらよろしくお願いします。 【環境】WindowsXP     VisualBasic2005 【プログラムの流れ】例:SJISコードを取得する場合 文字列を受取る→1文字取得→System.Text.EncodingでSJIS指定のバイト型配列文字に変換(文字コードを取得)

  • 重複しない乱数を作り配列に入れる(AS3.0)

    Flash Pro CS5 AS3.0 で記述しています。 1~10の整数をランダムかつ重複せずに配列に格納したいと考えています。 そこで,ネット上で参考になるソースを見つけ, 以下のように書き直しました。 var int_a = new Array(); var int_b = new Array(); function RandomInt():void{ //ここだけ変更すればよい var maxN:Number = 10;//乱数の最大値 //0~maxNの数字を全部配列に入れる for (var i:int=0; i< maxN; i++) { int_a[i] = i+1; } var j:Number = 0; var a_length:Number = int_a.length; //要は配列をシャッフルする while (a_length) { var int_r:Number = Math.floor(Math.random()*(maxN+1-j)); //乱発生した整数を配列int_bに順番に入れ、int_aから削除する int_b[j] = int_a.splice(int_r, 1); j++; //配列int_a内の数字が一つずつ減っていく a_length = int_a.length; } //ここで配列int_bがシャッフルされた trace(int_b); } RandomInt(); としました。 しかし出力結果がなぜか 8,2,4,9,,7,6,5,10,3,1のように抜けている部分があり, 次のフレームで for(var j:int=1; j <= 10; j++){   trace(int_b[j]); } として確認してもやはり 2 4 9 7 6 5 10 3 1 となってしまします。 どの部分がおかしいのか教えていただきたいです。 また,乱数発生の部分で Math.floor(Math.random()*(maxN+1-j)); という風に記述してあったのですが,ここは間違いではないのでしょうか? jを引いていくと発生する乱数の範囲が徐々に狭くなっていってしまうと思ったのですが; それとも元のソースコードを使って ttp://www.renowan.com/blog/?p=143 0~9までの乱数を発生させてそれぞれに1を足す方が簡単でしょうか? よろしくお願いします。

    • ベストアンサー
    • Flash
  • テキストデータのインポートの仕方

    初心者です。  汎用ホストコンピュータのデータベースのデータをMySQLにインポートをしたいと考えています。 テキストデータ(項目の区切りがない)で出力し、MySQLでテーブル定義し、インポートしてはと思っています。 1、ホスト側データのレイアウト ・顧客コード(英数字6桁)---> 123456 ・商品名(日本語5文字(10バイト) ---> 商品AAA ・数量(符号付、5バイト)---> +15 ・単価(符号なし、整数部6バイト、小数部 3バイト)---> 125.55 2、テキストデータ 12345商品AAA00015+00012555 3、MySQLのテーブル  CREATE TABLE テーブル名   ( kokyakucode varchr(6), shouhinmei ??????,   suryou    ??????,   tanka ?????? ) character set charset_name; ではと考えているのですが、????部分がわかりません。 よろしくお願いします。

    • ベストアンサー
    • MySQL

専門家に質問してみよう