So-net無料ブログ作成

Socket Debuggerを使ってみる! ポート:6! レコードを送りたい! [NETWORK]

SocketDebugger

こことか、 https://www.udom.co.jp/sdg/
こことか、 http://sdg.ex-group.jp/lua.html

をまず見てね!

※SokcetDebuggerはビット演算を行う拡張関数が有りました!


通信で値を集めたレコードを送受信したい等という事はよくある要求じゃあないですか、特に業務辺りなら。
なのでレコード、C言語であれば構造体に値を代入してまるっと投げちゃうあれができるかどうかをやってみます。
送信処理のところを以下にしてみます。
  -- レコードデータを生成する
  sendData = {0,1,2,3,4,5,0.12345,'designed by hamayan.'}
  SendData( sendData )

つまり整数、実数、文字列がどうなるのか?
record_transmit_013.pngうーむ、最初の6個のデータはbyte型として送られ、浮動小数点型は0しか送られず、それ以降のデータは削除のようです。


record_transmit_014.pngLANアナライザー上でも7byteしか認められません。


さてさて、困ったねぇ、、、C言語の様に型が明確でないと変換どうするのかねぇ、、、

追記
結局のところこのSocket DebuggerでサポートしているLuaのver.5.1では数値は実数(double)であり、大きな数値ほど誤差が大きくなる。と言うか変数をネットワーク上に流すためにbyteデータに変換しようとしても正確に変換できない。
例えばある変数の値に-1を代入したとして、それが64bitの変数を期待している場合、ユーザーは16進数で
0xFFFFFFFFFFFFFFFF
を期待すると思うが、実際には誤差でオーバーフローして0x0000000000000000となってしまう、、、
---------------------------------------------
-- convert int64 to byte array by big endian.
-- 数値は実数(double)型である為、例えば64bitで-1は正しく変換できない
---------------------------------------------
function ConvertInt64ToByteArrayBig( value )
--  value = value % 2 ^64

  local tbl = {}

  if value < 0 then 
    value = 2^64 + value 
  end

  tbl[ 1 ] = value / 2 ^ 56
  value = value % 2 ^ 56

  tbl[ 2 ] = value / 2 ^ 48
  value = value % 2 ^ 48

  tbl[ 3 ] = value / 2 ^ 40
  value = value % 2 ^ 40

  tbl[ 4 ] = value / 2 ^ 32
  value = value % 2 ^ 32

  tbl[ 5 ] = value / 2 ^ 24
  value = value % 2 ^ 24

  tbl[ 6 ] = value / 2 ^ 16
  value = value % 2 ^ 16

  tbl[ 7 ] = value / 2 ^ 8
  value = value % 2 ^ 8

  tbl[ 8 ] = value

  return tbl
end


さらにLuaのver.5.1ではビット演算子もシフト演算子もサポートしていないもの痛い。Luaのver.5.3では64bit整数もビット演算子もサポートされている様な気がする。

Luaのver.5.3リファレンスマニュアルより
「数値型には2種類の内部表現 (あるいは2つのサブタイプ) があります。 ひとつは整数で、もうひとつは浮動小数点数です。 それぞれの表現がいつ使われるかについては明確なルールがありますが、両者は必要に応じて自動的に変換されます (§3.4.3 を参照)。 そのためプログラマは整数と浮動小数点数の違いをほとんど無視することもできますし、各数値の表現について完全に制御を握ることもできます。 標準のLuaでは64ビットの整数と倍精度 (64ビット) の浮動小数点数を使用します」

「3.4.2 – ビット演算子
ビット演算子には以下のものがあります。

&: ビットごとの論理積
|: ビットごとの論理和
~: ビットごとの排他的論理和
>>: 右シフト
<<: 左シフト
~: 単項ビットごとの否定
ビット演算子はすべて、引数を整数に変換し (§3.4.3 を参照)、その整数の全ビットを演算し、結果を整数で返します。

右シフトと左シフトは両方とも、空いたビットをゼロで埋めます。 変位に負の値を指定すると逆方向にシフトします。 変位の絶対値が整数のビット数以上であれば結果はゼロになります (すべてのビットが追い出されます)。」
困ったねぇ、、、つまり正直言ってLuaのバージョンを上げて欲しい!

nice!(0)  コメント(0) 

nice! 0

コメント 0

コメントを書く

お名前:[必須]
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

※ブログオーナーが承認したコメントのみ表示されます。