thunderbolt!

thunderbolt!

PR

×

カレンダー

キーワードサーチ

▼キーワード検索

2015.12.09
XML
テーマ: 私のPC生活(7589)
カテゴリ: 家電
vb.netを使っていて、
File.ReadAllBytesなどでバイナリファイルを配列に格納するとbyte型(符号なし整数:0~255)になるんですが、元データがsbyte型(符号つき整数:-128~127)であったとしても、byte型として読まれてしまいます。

そこでbyte型をsbyte型に変換する必要があるのですが、Byte型の変数の.ToSByteメソッドなどではなぜか変換ができません。
しょうがないので1バイトづつ読んで、128より大きければ256を引くというような処理をしていたのですが、遅い。
そもそもIF文は遅いし、処理データが何十GBもあるので、この変換作業がバカにならない。


ネットで検索しても良い方法が見つからないので半ば諦めていたのですが、
そもそも上位1ビットを符号に割り当てているだけなので、うまくやればビット演算でできそうな気がしてきました。
128(&H80)より大きい場合は下位7ビットから128を引く、そうじゃない場合は引かない(ゼロを引く)と良い。


入力ファイルがSByte形式で書かれているとします。


Dim DataLength as Integer = Buffer.Length   'データの要素数を求めて、
Dim Data(DataLength ) as SByte  ’符号つき整数に変換されたデータの入る配列を用意して、

For i=0 to Buffer.length-1
  Data(i)=(Buffer(i) and 127) - (Buffer(i) and 128)   '上位1ビットが1なら下位7ビットから128を引く、上位1ビットが0なら下位7ビットから0を引く
Next i

これでOKでした。意外と簡単。
動作速度は、1バイトずつIF文で判別している場合に比べて約2倍早くなりました。

引き算の部分もビット演算子で書けばもっと早くなるのかしらん?


こんなことしないでも
Dim Buffer() As SByte = File.ReadAllBytes("入力ファイルパス")  '初めからSByte形式で読み込む
が出来れば苦労しないで済んだんですけどねぇ・・



=BITAND(A1,127) - BITAND(A1, 128)
で1バイトの符号つき整数(-128~127)に変換出来ます。


こんなの常識?



【はじめての方限定!一冊無料クーポンもれなくプレゼント】Professional Visual Studio 2013【電子書籍】[ Bruce Johnson ]



ではごきげんよう。





お気に入りの記事を「いいね!」で応援しよう

最終更新日  2015.12.20 23:50:03
コメント(0) | コメントを書く


【毎日開催】
15記事にいいね!で1ポイント
10秒滞在
いいね! -- / --
おめでとうございます!
ミッションを達成しました。
※「ポイントを獲得する」ボタンを押すと広告が表示されます。
x
X

コメント新着

quanta511 @ Re[1]:柿の種も高級品になるのか(11/20) まーっさんへ コメントありがとうござい…
まーっ@ Re:柿の種も高級品になるのか(11/20) 更新を楽しみに拝見してます。 古い記事へ…
私はイスラム教徒です@ Re:美大あるある 工学部も同じ(05/07) 神神は言った: コーランで 『 (21) 人…
聖書預言@ Re:どんど焼き(01/14) 神の御子イエス・キリストを信じる者は永…
aki@ この様な書き込み大変失礼致します 日本も当事国となる台湾有事を前に反日メ…

© Rakuten Group, Inc.
X

Design a Mobile Website
スマートフォン版を閲覧 | PC版を閲覧
Share by: