tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルDouble型のアスキー変換について
記事No10543
投稿日: 2011/07/01(Fri) 17:43
投稿者ハイド
Double型(8バイト)に最大8文字のアスキー文字列を格納・表示させたいのですが、
なかなか上手くできません。
どのようにプログラミングすればよいでしょうか。教えてください。

[ツリー表示へ]
タイトルRe: Double型のアスキー変換について
記事No10544
投稿日: 2011/07/02(Sat) 07:50
投稿者shu
> Double型(8バイト)に最大8文字のアスキー文字列を格納・表示させたいのですが、
> なかなか上手くできません。
> どのようにプログラミングすればよいでしょうか。教えてください。
byte(7)にいったん設定してBinaryReaderでよむとかかな。
BitConverterでもよいかも

[ツリー表示へ]
タイトルRe^2: Double型のアスキー変換について
記事No10545
投稿日: 2011/07/02(Sat) 14:59
投稿者ハイド
> > Double型(8バイト)に最大8文字のアスキー文字列を格納・表示させたいのですが、
> > なかなか上手くできません。
> > どのようにプログラミングすればよいでしょうか。教えてください。
> byte(7)にいったん設定してBinaryReaderでよむとかかな。
> BitConverterでもよいかも

アドバイスありがとうございます。
現在、System.BitConverter.GetBytes()でバイト配列に変換→System.Text.ASCIIEncoding.ASCII.GetString()でアスキー変換しています。

Double値 = 65.0 → 'A'には変換できています。
問題は "AAAAAAAA"など8バイトフルに使った場合です。
8バイトなので8文字OKだと思っているのですが、どうも桁落ちしてしまうらしく正しい結果が得られないのです。

[ツリー表示へ]
タイトルRe^3: Double型のアスキー変換について
記事No10546
投稿日: 2011/07/02(Sat) 15:18
投稿者shu
> アドバイスありがとうございます。
> 現在、System.BitConverter.GetBytes()でバイト配列に変換→System.Text.ASCIIEncoding.ASCII.GetString()でアスキー変換しています。
>
> Double値 = 65.0 → 'A'には変換できています。
> 問題は "AAAAAAAA"など8バイトフルに使った場合です。
> 8バイトなので8文字OKだと思っているのですが、どうも桁落ちしてしまうらしく正しい結果が得られないのです。

そうなるとDoubleが無理があるのかも、Int64とかUInt64にしてみてはどうでしょう?

[ツリー表示へ]
タイトルRe^4: Double型のアスキー変換について
記事No10547
投稿日: 2011/07/02(Sat) 15:42
投稿者ハイド
> > アドバイスありがとうございます。
> > 現在、System.BitConverter.GetBytes()でバイト配列に変換→System.Text.ASCIIEncoding.ASCII.GetString()でアスキー変換しています。
> >
> > Double値 = 65.0 → 'A'には変換できています。
> > 問題は "AAAAAAAA"など8バイトフルに使った場合です。
> > 8バイトなので8文字OKだと思っているのですが、どうも桁落ちしてしまうらしく正しい結果が得られないのです。
>
> そうなるとDoubleが無理があるのかも、Int64とかUInt64にしてみてはどうでしょう?

一応、Longでは可能だということは確認しています。
客先からDouble型という指定がありましたので色々と模索しているところです。
もしVB的に実現不可能なのであればLongにせざるを得ないかもと思っています。

[ツリー表示へ]
タイトルRe^5: Double型のアスキー変換について
記事No10548
投稿日: 2011/07/02(Sat) 16:05
投稿者shu
> > > Double値 = 65.0 → 'A'には変換できています。
> > > 問題は "AAAAAAAA"など8バイトフルに使った場合です。
> > > 8バイトなので8文字OKだと思っているのですが、どうも桁落ちしてしまうらしく正しい結果が得られないのです。
> >
> > そうなるとDoubleが無理があるのかも、Int64とかUInt64にしてみてはどうでしょう?
>
> 一応、Longでは可能だということは確認しています。
> 客先からDouble型という指定がありましたので色々と模索しているところです。
> もしVB的に実現不可能なのであればLongにせざるを得ないかもと思っています。

一応、

        Dim byts = New Byte() {65, 65, 65, 65, 65, 65, 65, 65}
        Dim a = BitConverter.ToDouble(byts, 0)
        Dim byts2 = BitConverter.GetBytes(a)

を実行してみましたが、byts,byts2の内容は同じでしたが、どういう場合が駄目なのでしょう?aの中身を評価して表示されたものを設定するのは駄目ですよ?

[ツリー表示へ]
タイトルRe^6: Double型のアスキー変換について
記事No10549
投稿日: 2011/07/02(Sat) 16:18
投稿者ハイド
> > > > Double値 = 65.0 → 'A'には変換できています。
> > > > 問題は "AAAAAAAA"など8バイトフルに使った場合です。
> > > > 8バイトなので8文字OKだと思っているのですが、どうも桁落ちしてしまうらしく正しい結果が得られないのです。
> > >
> > > そうなるとDoubleが無理があるのかも、Int64とかUInt64にしてみてはどうでしょう?
> >
> > 一応、Longでは可能だということは確認しています。
> > 客先からDouble型という指定がありましたので色々と模索しているところです。
> > もしVB的に実現不可能なのであればLongにせざるを得ないかもと思っています。
>
> 一応、
>
>         Dim byts = New Byte() {65, 65, 65, 65, 65, 65, 65, 65}
>         Dim a = BitConverter.ToDouble(byts, 0)
>         Dim byts2 = BitConverter.GetBytes(a)
>
> を実行してみましたが、byts,byts2の内容は同じでしたが、どういう場合が駄目なのでしょう?aの中身を評価して表示されたものを設定するのは駄目ですよ?

以下のような感じです。

Dim dblValue As Double
Dim lngValue As Long
Dim bytDatas() As Byte

dblValue = 4702111234474983745 ' (ASCII:AAAAAAAA)
lngValue = CLng(dblValue)
bytDatas = System.BitConverter.GetBytes(lngValue)

bytDatasの中身を見ると、
(0):0
(1):64
(2):65
(3):65
(4):65
(5):65
(6):65
(7):65

lngValueの時点で桁落ちしているのです。

[ツリー表示へ]
タイトルRe^7: Double型のアスキー変換について
記事No10550
投稿日: 2011/07/02(Sat) 17:43
投稿者ハイド
> >         Dim byts = New Byte() {65, 65, 65, 65, 65, 65, 65, 65}
> >         Dim a = BitConverter.ToDouble(byts, 0)
> >         Dim byts2 = BitConverter.GetBytes(a)

確かに、正しく変換できているようですね。

大きな勘違いをしているのかも知れないのですが、
Double型でアスキーコードを表現する場合、整数型とはまた違った表現になるのでしょうか。

@
    Dim lngValue As Long
    Dim bytDatas() As Byte
    
    lngValue = 65
    bytDatas = System.BitConverter.GetBytes(lngValue)
の場合は、

        bytDatas(0):65
        bytDatas(1):0
        bytDatas(2):0
        bytDatas(3):0
        bytDatas(4):0
        bytDatas(5):0
        bytDatas(6):0
        bytDatas(7):0
ですが、

A
    Dim dblValue As Double
    Dim bytDatas() As Byte
    
    dblValue = 65.0
    bytDatas = System.BitConverter.GetBytes(dblValue)
の場合は、

        bytDatas(0):0
        bytDatas(1):0
        bytDatas(2):0
        bytDatas(3):0
        bytDatas(4):0
        bytDatas(5):64
        bytDatas(6):80
        bytDatas(7):64

と違った結果になっているので。

[ツリー表示へ]
タイトルRe^8: Double型のアスキー変換について
記事No10551
投稿日: 2011/07/02(Sat) 18:20
投稿者shu
>
> 大きな勘違いをしているのかも知れないのですが、
> Double型でアスキーコードを表現する場合、整数型とはまた違った表現になるのでしょうか。

256 ^ 7 * chr1 + 256 ^ 6 * chr2 + ・・・ chr8

のように表現したいのでしたらDoubleでは可逆性を保つのは厳しいですね。


Doubleの内部表現はInteger,Longとは全然違います。
Wikiより
http://ja.wikipedia.org/wiki/%E6%B5%AE%E5%8B%95%E5%B0%8F%E6%95%B0%E7%82%B9%E6%95%B0

[ツリー表示へ]
タイトルRe^9: Double型のアスキー変換について
記事No10552
投稿日: 2011/07/02(Sat) 19:38
投稿者ハイド
> >
> > 大きな勘違いをしているのかも知れないのですが、
> > Double型でアスキーコードを表現する場合、整数型とはまた違った表現になるのでしょうか。
>
> 256 ^ 7 * chr1 + 256 ^ 6 * chr2 + ・・・ chr8
>
> のように表現したいのでしたらDoubleでは可逆性を保つのは厳しいですね。
>
>
> Doubleの内部表現はInteger,Longとは全然違います。
> Wikiより
> http://ja.wikipedia.org/wiki/%E6%B5%AE%E5%8B%95%E5%B0%8F%E6%95%B0%E7%82%B9%E6%95%B0

調べていただきありがとうございました。
やはり、表現方法を勘違いしているだけのようです。

今までお付き合いいただき本当にありがとうございました。
また何かありましたらその時はまたよろしくお願いします。

[ツリー表示へ]
タイトルRe^8: Double型のアスキー変換について
記事No10554
投稿日: 2011/07/04(Mon) 10:43
投稿者魔界の仮面弁士
>     Dim bytDatas() As Byte
datas という英単語はありません。data 自体が複数形ですよ(単数形は datum)。
# 集合名詞として、data を単数的に扱う事も多いですけれども。


>     dblValue = 65.0
>         bytDatas(0):0
>         bytDatas(1):0
>         bytDatas(2):0
>         bytDatas(3):0
>         bytDatas(4):0
>         bytDatas(5):64
>         bytDatas(6):80
>         bytDatas(7):64
Double 65.0 の内部バイナリ表現が、
 00,00,00,00,00,40,50,40
となる理由ですが、この内訳は、以下のようになっています。


まず、65.0を2進小数で表すと「1000001.00000……」となります。

浮動小数点型というのは、整数部が 1 な小数として表されており、その場合の
「符号」「小数点位置」「小数部のデータ」を管理するというデータ形式です。

符号は今回「+」、小数値は、小数点桁位置は6桁シフトさせた「1.00000100000……」です。

そして小数点位置(仮数部)は、右シフトか左シフトかの符号調整を行う関係上、
Single なら 127、Double なら 1023 という値という値をバイアスした値です。
今回は、Double 型の 6桁を表すため、実際には『1029』という値で格納します。


続いて、この『+』『1029』『.00000100000』の部分をバイナリ化していきましょう。

符号部は Double では 1bit。「+」なので『0』で表します。
仮数部は Double では 11bit。「1029」の2進数表現なので『10000000101』です。
指数部は Double では 52bit。「.00000100000……」を 52 桁で表して
『0000010000000000000000000000000000000000000000000000』です。

これら符号部、仮数部、指数部を順に並べると、
[0][10000000101][0000010000000000000000000000000000000000000000000000]
となり、バイト単位で区切ると
[0100 0000],[0101 0000],[0100 0000],[0000 0000],[0000 0000],[0000 0000],[0000 0000],[0000 0000]
です。そしてこれが、「65.0」のバイナリダンプデータとなります。
16進数で表せば 40,50,40,00,00,00,00,00 ですし、
10進数で表せば 64,80,64,0,0,0,0,0 となるわけですね。

# 実際の並び順が逆なのは、Windows ではリトルエンディアンで管理されるためです。

[ツリー表示へ]
タイトルRe^9: Double型のアスキー変換について
記事No10555
投稿日: 2011/07/04(Mon) 10:46
投稿者魔界の仮面弁士
> Double 65.0 の内部バイナリ表現が、
>  00,00,00,00,00,40,50,40
> となる理由ですが、この内訳は、以下のようになっています。

念のため、今度は逆方向の変換も説明しておきます。

まずは、00,00,00,00,00,40,50,40 を 64 桁の 2進数表現に変換します。
ここでは説明の都合上、並び順を逆にしてあります(元がリトルエンディアンなので)。

[0100 0000],[0101 0000],[0100 0000],[0000 0000],[0000 0000],[0000 0000],[0000 0000],[0000 0000]

そして Double 型(倍精度浮動小数点型)とは、
 符号部 1bit
 指数部 11bit
 仮数部 52bit
から成るため、上記 64 bit を 1、11、52 に分解します。

[0][10000000101][0000010000000000000000000000000000000000000000000000]


符号部「0」。これは「+」を表します。

指数部「10000000101」。10進数でいうと 1029 です。
指数部は 1023 がバイアスされているため、これは 6桁分のシフトを意味します。

残る仮数部については、2進小数表現としての
[1.0000010000000000000000000000000000000000000000000000]を意味します。

符号部が+、指数部で 6 桁シフトされているため、これは
「+1000001.0000000000000000000000000000000000000000000000」の意味です。
つまり、10進数でいえば『65.0』に相当する値というわけですね。

参考情報として、こちらもどうぞ。
http://www.gizcollabo.jp/vbtomo/boards/vbqanda.php?do=spread&num=14852

[ツリー表示へ]
タイトルRe^10: Double型のアスキー変換について
記事No10556
投稿日: 2011/07/04(Mon) 11:40
投稿者ハイド
> > Double 65.0 の内部バイナリ表現が、
> >  00,00,00,00,00,40,50,40
> > となる理由ですが、この内訳は、以下のようになっています。
>
> 念のため、今度は逆方向の変換も説明しておきます。
>
> まずは、00,00,00,00,00,40,50,40 を 64 桁の 2進数表現に変換します。
> ここでは説明の都合上、並び順を逆にしてあります(元がリトルエンディアンなので)。
>
> [0100 0000],[0101 0000],[0100 0000],[0000 0000],[0000 0000],[0000 0000],[0000 0000],[0000 0000]
>
> そして Double 型(倍精度浮動小数点型)とは、
>  符号部 1bit
>  指数部 11bit
>  仮数部 52bit
> から成るため、上記 64 bit を 1、11、52 に分解します。
>
> [0][10000000101][0000010000000000000000000000000000000000000000000000]
>
>
> 符号部「0」。これは「+」を表します。
>
> 指数部「10000000101」。10進数でいうと 1029 です。
> 指数部は 1023 がバイアスされているため、これは 6桁分のシフトを意味します。
>
> 残る仮数部については、2進小数表現としての
> [1.0000010000000000000000000000000000000000000000000000]を意味します。
>
> 符号部が+、指数部で 6 桁シフトされているため、これは
> 「+1000001.0000000000000000000000000000000000000000000000」の意味です。
> つまり、10進数でいえば『65.0』に相当する値というわけですね。
>
> 参考情報として、こちらもどうぞ。
> http://www.gizcollabo.jp/vbtomo/boards/vbqanda.php?do=spread&num=14852

詳しく説明していただきありがとうございます。
大変勉強になりました。

[ツリー表示へ]