ページ 1 / 1
変数のbyte型への変換手順
Posted: 2012年1月11日(水) 16:10
by ぽんた
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型への変換手順
Posted: 2012年1月11日(水) 16:20
by ぽんた
記載忘れのため追記ですが、対象はC言語です。
ひとつ思いついている解決策は、
1111ビットマスクを4つ用意して右ビットシフトでbyte型
まで降ろしてきて取り出す方法です。
Re: 変数のbyte型への変換手順
Posted: 2012年1月11日(水) 16:26
by beatle
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型への変換手順
Posted: 2012年1月11日(水) 16:55
by ぽんた
beatleさん、早速のご回答ありがとうございます。
32bitの変数に代入して8bit配列で取り出すだけで処理が
完了するんですね。
基本に忠実にやれば破綻しないだろう・・・と知ってる知識だけでやっていましたが
結果的には回りくどいことをしていました。
ずっと考えていたプロセスがたった2行で済むなんて。。。
これでだいぶ前進しそうです。ありがとうございました。
Re: 変数のbyte型への変換手順
Posted: 2012年1月11日(水) 18:25
by beatle
ただしバイトオーダーには気をつけてくださいね.
p[0]からp[3]までを順番に送って,受信側でも同じ順番で受け取ったとしても,双方のシステムのバイトオーダーが異なれば違う値になりますので.
Re: 変数のbyte型への変換手順
Posted: 2012年1月12日(木) 11:09
by ぽんた
送信側がビッグエンディアンで、
受信側は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
Re: 変数のbyte型への変換手順
Posted: 2012年1月12日(木) 16:01
by YuO
ビッグエンディアンのデータに対しては,エンディアン変換は自前で行う必要があるので注意。
# まじめにネットワークオーダーからホストオーダーへの変換をするなら
IPAddress.NetworkToHostOrder メソッドあたり。手抜きなら,
Array.Reverse メソッドあたり。
Re: 変数のbyte型への変換手順
Posted: 2012年1月13日(金) 11:46
by ぽんた
YuOさん、ありがとうございます。
リンク先のmsdnには先人の知恵がつまってるんですね。
上達すればコーディングの行数が減らせる、と思えば
面倒でも関数を覚えていく気力が(ちょっとだけ)出てきます。
ざっと目を通しましたが、使い方はおおよそ分かりましたので
さっそく組み込んでみます。