🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
MFC

MFC (Microsoft Fouondation Class)とは、MicrosoftがVC++用に開発したWindows用アプリケーションのフレームワークです。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

3回答

1345閲覧

Python 3.6.8 バイトの交換について

BluePi85

総合スコア22

MFC

MFC (Microsoft Fouondation Class)とは、MicrosoftがVC++用に開発したWindows用アプリケーションのフレームワークです。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2019/09/09 12:11

前任者からの引継ぎで、MFCにてバイナリの測定データの読み込み時に、
_swab を用いてバイト交換を行っています。

C++

1# 引き継いだコード 2 3unsigned short int src; 4short int dest; 5 6_swab((char *)&src, (char *)&dest, 2); // ビッグエンディアンの為、前後8バイト入れ替える 7

デバックを行った際、src = 51456 ⇒ dest = 201 となっていました。

同様のプログラムをPythonで作成したく
サイトを検索しても、求めてる情報がなく、解決策を見出せません。

申し訳ありませんが、
アドバイスを頂けないでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

struct.unpackを使うとバイト列から任意の型、エンディアンとして数値に変換できます。

Python

1import struct 2for b in [b'\x00\xc9', b'\xff\xd2']: 3 n1 = struct.unpack('<H', b) # unsigned short little-endian 4 n2 = struct.unpack('>h', b) # signed short big-endian 5 print(n1[0], n2[0]) 6 7# 51456 201 8# 54015 -46

投稿2019/09/10 11:24

can110

総合スコア38341

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

こんな感じでしょうか

Python

1import array 2value = 51456; 3bytes = array.array('H', [ value ]) 4print(bytes[0]) 5bytes.byteswap() 6print(bytes[0])

投稿2019/09/09 12:32

nomuken

総合スコア1627

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

2バイト整数の上位と下位をひっくり返すってことで

d = ((s>>4)&0xff) | ((s<<4)&0xff00)
d = ((s>>8)&0xff) | ((s<<8)&0xff00)

こんなもんでどうでしょう

#まちがたんで修正

投稿2019/09/09 12:20

編集2019/09/09 12:26
y_waiwai

総合スコア88038

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2019/09/09 12:32

で、ついでに言っときますと、Big/Littleのエンディアン変換で上下をひっくり返すというのはちと筋が悪いです バイト列から2バイトとってくる段階でBig/Little順で数値取得するようにしましょう
BluePi85

2019/09/10 08:08

ご返信ありがとうございます。 教えて頂いたコードにて試みたところ、 以下の場合、 src = 54015 ⇒ dest = -46 となって欲しい部分が src = 54015 ⇒ dest = 65490 となってしまいました。 お手数ですが、再度教えて頂けないでしょうか?
y_waiwai

2019/09/10 08:18

54015を16進にすると、0xd2ff となります これをひっくり返すと 0xffd2で、65490であってますよ また、16ビットint(符号付き) にすると-46になります。 それであってます
BluePi85

2019/09/10 10:56

ありがとうございます。 符号付きにすれば良いのですね。 とても参考になりました。
y_waiwai

2019/09/10 11:26

pythonで符号付き2バイトを出そうとしたらちょっと工夫が必要ですね if( 0 != (d&0x8000)) d = -(0x10000-d) あたりかなー(要検証
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問