数値のバイナリ配列への変換方法を教えてください

조회 수: 9 (최근 30일)
ns
ns 2018년 6월 21일
댓글: michio 2018년 6월 22일
次の処理を考えていますが、バイナリ配列への変換方法(②)がわかりません。どのように処理すればいいでしょうか?
①数値データのバイト順を変換する《swapbytes》。 ②4バイトのバイナリデータとして、変数に格納する。
例えば、数値「1403110」を「3865580800」に変換し、「header」という変数に4バイトのバイナリデータとして格納(追記)したいです。.NETのGetBytes関数のような、一度に変換する方法などあればご教示ください。
01行>header = double('RIFF'); %headerに「RIFF」を格納する
02行>fileSize=1403110; %数値「1403110」を定義する
03行>xFileSize = swapbytes(fileSize); %「1403110」のバイト順を変換し、「3865580800」にする
04行>header = horzcat(wavHeader, xFileSize); %headerにバイト順を変換した数値を4byteで格納する
期待する結果: header = [82 73 70 70 230 104 21 0](ASCIIのdecimal表示)
上記を実行した結果:header = [82 73 70 70 3865580800]

채택된 답변

michio
michio 2018년 6월 21일
편집: michio 2018년 6월 21일
header = double('RIFF'); %headerに「RIFF」を格納
fileSize = uint32(1403110); %数値「1403110」を uint32 で定義
xFileSize = swapbytes(fileSize); %「1403110」のバイト順を変換し、「3865580800」に
xFileSizeBin = dec2bin(xFileSize)
xFileSizeBin8 = reshape(xFileSizeBin,8,4)'
xFileSizeDec4 = bin2dec(xFileSizeBin8)'
header = horzcat(header, xFileSizeDec4)
で header = [82 73 70 70 230 104 21 0] という結果になります。変換の過程は出力をそれぞれ確認いただければと。まったくもって美しくないコードですが、お役に立ちましたら。。
  댓글 수: 2
ns
ns 2018년 6월 22일
回答ありがとうございました。 一部変更しましたが、参考になりました。 変更したのは、reshape以降です。4行8列にするべきと思いreshape(xFileSizeBin,4,8)としましたが、行方向にデータが分割されていくので、バイナリ配列の順番が想定通りになりませんでした。horzcatした際も配列のサイズが異なるというエラーになります。
なのでreshapeをあきらめ、dec2binした結果の32ビットを地道に8ビットに分割し(配列から8ビットずつ要素を取得)、bin2decで10進数に変換しました。 変更はしましたが、いただいた回答を手掛かりに解決することができ、助かりました。ありがとうございました。
michio
michio 2018년 6월 22일
参考にしていただきありがとうございます。 おっしゃる通り、4行8列にする必要があるので、上の例では一旦 8行4列に reshape した上で、転置しております。
reshape(xFileSizeBin,8,4)'
MATLABで行列は Column-major orderメジャーで定義されるが故、バイナリ配列の順番を想定通りにするための措置でございます。

댓글을 달려면 로그인하십시오.

추가 답변 (0개)

카테고리

Help CenterFile Exchange에서 ビット単位の演算에 대해 자세히 알아보기

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!