■82953 / inTopicNo.3) |
Re[1]: バイナリエディタでDoubleを探す方法 |
□投稿者/ 魔界の仮面弁士 (1144回)-(2017/02/21(Tue) 09:46:29)
|
2017/02/21(Tue) 09:58:02 編集(投稿者)
■No82950 (ママン さん) に返信 > バイナリエディタだと、 > バイト配列か、バイト配列を文字列に変換したものと表示されるため、 そうとも限らないでしょう。 浮動小数点検索に対応したバイナリエディタもありますよ。(TSXBINとか)
> 倍精度浮動小数点型(Double)で定義されたある数値を > バイト配列と文字列に変換したいのですが 具体的には、どういう Double 値の時に、どういう結果にしたいのでしょうか?
バイト配列というのも、Double の生バイナリの形でよいのかどうか、 文字列と言うのも、どういう形式にするのか…。
そもそも浮動小数点は、元が二進小数な上に指数部の桁が広いので、文字列にするとなると 表現の誤差を回避するような形が求められるかと思います。たとえば、文字列と数値で 相互変換可能なラウンドトリップ書式を用いるのが良いかとは思いますが、 今回の要件が曖昧なので、それが適しているのかは判断が付かないです。 https://msdn.microsoft.com/ja-jp/library/dwhawy9k.aspx#RFormatString
> VB.NETだとどのようなコードで実現可能でしょうか? ひとまず System.BitConverter とかは如何でしょう。
''' <summary>バイナリ検索</summary> Iterator Function Search(ByVal source() As Byte, pattern() As Byte) As IEnumerable(Of Integer) Dim length As Integer = pattern.Length Dim i As Integer = Array.IndexOf(source, pattern(0)) While (0 <= i AndAlso i <= (source.Length - length)) If source.Skip(i).Take(length).SequenceEqual(pattern) Then Yield i End If i = Array.IndexOf(source, pattern(0), i + length) End While End Function
''' <summary>Double 値を検索し、見つかった位置を返す</summary> Function Search(ByVal source() As Byte, value As Double) As IEnumerable(Of Integer) Return Search(source, BitConverter.GetBytes(value)) End Function ''' <summary>Single 値を検索し、見つかった位置を返す</summary> Function Search(ByVal source() As Byte, value As Single) As IEnumerable(Of Integer) Return Search(source, BitConverter.GetBytes(value)) End Function ''' <summary>文字列を検索し、見つかった位置を返す</summary> Function Search(ByVal source() As Byte, text As String, ByVal enc As Encoding) As IEnumerable(Of Integer) Return Search(source, enc.GetBytes(text)) End Function
|
|