変数のbyte型への変換手順

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ぽんた

変数のbyte型への変換手順

#1

投稿記事 by ぽんた » 14年前

LANを経由してデータを転送したいと思います。

転送したいデータ(変数)は、一旦byte型に変換する必要があります。
ここで、8桁の10進数、最大で99999999の数値を送信しなければなりません。

今考えているのは、
101111101011110000011111111(99999999)

0000 0101(5),1111 0101(245),1110 0000(224),1111 1111(255)
のbyte列に分解して送信、受信側でビットシフトで復元するものです。
このとき、2進数を4つに分解しなければなりませんが、どのように
プログラムするのが妥当でしょうか。

余談ですが、実際に転送したい変数にはfloat型、double型の変数ですが
これらは整数部と小数部に分離し、それぞれint型にキャスト済みです。

ご教示のほど宜しくお願い致します。

ぽんた

Re: 変数のbyte型への変換手順

#2

投稿記事 by ぽんた » 14年前

記載忘れのため追記ですが、対象はC言語です。

ひとつ思いついている解決策は、
1111ビットマスクを4つ用意して右ビットシフトでbyte型
まで降ろしてきて取り出す方法です。

beatle
記事: 1281
登録日時: 14年前
住所: 埼玉
連絡を取る:

Re: 変数のbyte型への変換手順

#3

投稿記事 by beatle » 14年前

99999999なら32ビットの変数に収まるので,int32_t型変数に格納したのち,その変数をuint8_t型の要素4の配列とみなして,先頭から順に送ればいいでしょう.

コード:

int32_t value = 99999999;
uint8_t* p = (uint8_t*)&value;

/* p[0], p[1], p[2], [3]を送信 */
int32_tとuint8_tはそれぞれ32ビット符号付き整数と8ビット無符号整数を表します.
#include <stdint.h>が必要です.

ぽんた

Re: 変数のbyte型への変換手順

#4

投稿記事 by ぽんた » 14年前

beatleさん、早速のご回答ありがとうございます。
32bitの変数に代入して8bit配列で取り出すだけで処理が
完了するんですね。

基本に忠実にやれば破綻しないだろう・・・と知ってる知識だけでやっていましたが
結果的には回りくどいことをしていました。
ずっと考えていたプロセスがたった2行で済むなんて。。。

これでだいぶ前進しそうです。ありがとうございました。

beatle
記事: 1281
登録日時: 14年前
住所: 埼玉
連絡を取る:

Re: 変数のbyte型への変換手順

#5

投稿記事 by beatle » 14年前

ただしバイトオーダーには気をつけてくださいね.
p[0]からp[3]までを順番に送って,受信側でも同じ順番で受け取ったとしても,双方のシステムのバイトオーダーが異なれば違う値になりますので.

ぽんた

Re: 変数のbyte型への変換手順

#6

投稿記事 by ぽんた » 14年前

送信側がビッグエンディアンで、
受信側はVisual Basicで2byteの組み立てを次のようにしています。
これを拡張してGetBigInt32を作りたいと思っています。

コード:

Private Function GetBigInt16(ByVal value As Byte(), ByVal Index As Integer) As UInt16
    Return ((CUShort(value(Index)) << 8) + value(Index + 1))
End Function

YuO
記事: 947
登録日時: 15年前
住所: 東京都世田谷区

Re: 変数のbyte型への変換手順

#7

投稿記事 by YuO » 14年前

ビッグエンディアンのデータに対しては,エンディアン変換は自前で行う必要があるので注意。
# まじめにネットワークオーダーからホストオーダーへの変換をするならIPAddress.NetworkToHostOrder メソッドあたり。手抜きなら,Array.Reverse メソッドあたり。

ぽんた

Re: 変数のbyte型への変換手順

#8

投稿記事 by ぽんた » 14年前

YuOさん、ありがとうございます。
リンク先のmsdnには先人の知恵がつまってるんですね。
上達すればコーディングの行数が減らせる、と思えば
面倒でも関数を覚えていく気力が(ちょっとだけ)出てきます。

ざっと目を通しましたが、使い方はおおよそ分かりましたので
さっそく組み込んでみます。

閉鎖

“C言語何でも質問掲示板” へ戻る