Armadilloフォーラム

c言語ビッグエンディアンでmake

k.sato

2024年6月17日 10時53分

佐藤と申します。

お世話になっております。

ABOSのalpineコンテナで開発をしております。
pythonで収集したデータをSNMPで読み出したく
ATDEにalpineコンテナを作成しnet-snmpをmakeしています。
pythonのメインとc言語のnet-snmp間はmmapでデータを共有しています。

お互いリトルエンディアンのときは正常に読めていたのですが、
下層に繋がる装置の関係でpythonの構造体をctypes.BigEndianStructureで定義したところ
SNMPでGETした値がおかしくなりました。
Makefile等でビッグエンディアンを指定してmakeすることはできるのでしょうか?

以上、よろしくお願い致します。

コメント

アットマークテクノの古賀です。

佐藤さん:
>ABOSのalpineコンテナで開発をしております。
>pythonで収集したデータをSNMPで読み出したく
>ATDEにalpineコンテナを作成しnet-snmpをmakeしています。
>pythonのメインとc言語のnet-snmp間はmmapでデータを共有しています。
>
>お互いリトルエンディアンのときは正常に読めていたのですが、
>下層に繋がる装置の関係でpythonの構造体をctypes.BigEndianStructureで定義したところ
>SNMPでGETした値がおかしくなりました。

mmap を使って Python アプリケーションと net-snmap の間で共有している領域に、ctypes.BigEndianStrucuture の内容を書き出していらっしゃる、ということかと思います。
であれば、共有メモリ領域に書き出す前に、ctypes.BigEndianStructure の内容を ctypes.LittleEndianStructure を使ってリトルエンディアンに変換して、ctypes.LittleEndianStrucure の内容を書き出す、というのが解になるかと思います。

これについては、以下の Blog 記事が参考になりそうです:
 https://veleno.hatenadiary.org/entry/2021/02/23/181824

いかがでしょうか?もし参考になりましたら幸いです。

古賀様

佐藤です。
回答ありがとうございます。

> mmap を使って Python アプリケーションと net-snmap の間で共有している領域に、ctypes.BigEndianStrucuture の内容を書き出していらっしゃる、ということかと思います。
> であれば、共有メモリ領域に書き出す前に、ctypes.BigEndianStructure の内容を ctypes.LittleEndianStructure を使ってリトルエンディアンに変換して、ctypes.LittleEndianStrucure の内容を書き出す、というのが解になるかと思います。
>
> これについては、以下の Blog 記事が参考になりそうです:
>  https://veleno.hatenadiary.org/entry/2021/02/23/181824
>
> いかがでしょうか?もし参考になりましたら幸いです。
確かにその段階で変換すればよいですね。
python側でリトルエンディアンに変換することでSNMPから正常な値がGET出来るようになりました。

ありがとうございました。