C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

16進数からLong型への変換

[トピック内 7 記事 (1 - 7 表示)]  << 0 >>

■92535 / inTopicNo.1)  16進数からLong型への変換
  
□投稿者/ usushio (30回)-(2019/10/03(Thu) 09:20:29)

分類:[VB.NET/VB2005 以降] 

VisualStudio2017 使用言語はVBです。

String型配列に{"08","D7","46","CB","77","E4","C0","00"}
と入っています。

この文字列を一列に結合しLong型に変換を行おうとしておりますが
CLng関数では有効範囲を超えてしまいます。

現状調べている段階ですが、有効なものがまだ見つかっておりません。


お力をお借りしたく思います。
引用返信 編集キー/
■92536 / inTopicNo.2)  Re[1]: 16進数からLong型への変換
□投稿者/ 魔界の仮面弁士 (2405回)-(2019/10/03(Thu) 09:43:06)
No92535 (usushio さん) に返信
> String型配列に{"08","D7","46","CB","77","E4","C0","00"}
> と入っています。
> この文字列を一列に結合しLong型に変換を行おうとしておりますが
> CLng関数では有効範囲を超えてしまいます。

ビッグエンディアン と リトルエンディアン とで。

Dim usushio As String() = {"08", "D7", "46", "CB", "77", "E4", "C0", "00"}

'&H08D746CB77E4C000UL (= 637,055,712,000,000,000 )
Dim v1 As Long = Convert.ToInt64(String.Join("", usushio), 16)
Dim v2 As ULong = Convert.ToUInt64(String.Join("", usushio), 16)

'&H00C0E477CB46D708UL (= 54,294,398,691,104,520 )
Dim v3 As Long = Convert.ToInt64(String.Join("", usushio.Reverse()), 16)
Dim v4 As ULong = Convert.ToUInt64(String.Join("", usushio.Reverse()), 16)
引用返信 編集キー/
■92537 / inTopicNo.3)  Re[1]: 16進数からLong型への変換
□投稿者/ 魔界の仮面弁士 (2406回)-(2019/10/03(Thu) 09:45:34)
No92535 (usushio さん) に返信
> この文字列を一列に結合しLong型に変換を行おうとしておりますが
> CLng関数では有効範囲を超えてしまいます。

こちらでは問題ありませんでした。どこかで結合ミスしていませんか?

Dim a As Long = CLng("&H08D746CB77E4C000")
Dim b As Long = CLng("&H00C0E477CB46D708")
引用返信 編集キー/
■92538 / inTopicNo.4)  Re[1]: 16進数からLong型への変換
□投稿者/ 774RR (738回)-(2019/10/03(Thu) 09:50:55)
どう変換したいの?こういう話をするときは Little Endian 形式と Big Endian 形式とあって
0x08D746CB77E4C000 と変換したい (=Big Endian 形式変換)
0x00C0E477CB46D708 と変換したい (=Little Endian 形式変換)

オイラ VB は知らんので C# なら

static void Main(string[] args)
{
    string[] sval = { "08", "D7", "46", "CB", "77", "E4", "C0", "00" };
    long v = 0;
    foreach (var s in sval)
    {
        v = (v << 8) | byte.Parse(s, System.Globalization.NumberStyles.HexNumber);
    }
    Console.WriteLine(v.ToString("X8"));
}

これがどっちの形式変換なのか理解できれば逆方向の変換も簡単だろうと思うの心

引用返信 編集キー/
■92569 / inTopicNo.5)  Re[2]: 16進数からLong型への変換
□投稿者/ usushio (32回)-(2019/10/08(Tue) 09:14:03)
No92536 (魔界の仮面弁士 さん) に返信
> ■No92535 (usushio さん) に返信
>>String型配列に{"08","D7","46","CB","77","E4","C0","00"}
>>と入っています。
>>この文字列を一列に結合しLong型に変換を行おうとしておりますが
>>CLng関数では有効範囲を超えてしまいます。
>
> ビッグエンディアン と リトルエンディアン とで。
>
> Dim usushio As String() = {"08", "D7", "46", "CB", "77", "E4", "C0", "00"}
>
> '&H08D746CB77E4C000UL (= 637,055,712,000,000,000 )
> Dim v1 As Long = Convert.ToInt64(String.Join("", usushio), 16)
> Dim v2 As ULong = Convert.ToUInt64(String.Join("", usushio), 16)
>
> '&H00C0E477CB46D708UL (= 54,294,398,691,104,520 )
> Dim v3 As Long = Convert.ToInt64(String.Join("", usushio.Reverse()), 16)
> Dim v4 As ULong = Convert.ToUInt64(String.Join("", usushio.Reverse()), 16)


返答ありがとうございます。
今回はビッグエンディアンの方法を探しておりました!
ありがとうございます。
引用返信 編集キー/
■92570 / inTopicNo.6)  Re[2]: 16進数からLong型への変換
□投稿者/ usushio (33回)-(2019/10/08(Tue) 09:15:34)
No92538 (774RR さん) に返信
> どう変換したいの?こういう話をするときは Little Endian 形式と Big Endian 形式とあって
> 0x08D746CB77E4C000 と変換したい (=Big Endian 形式変換)
> 0x00C0E477CB46D708 と変換したい (=Little Endian 形式変換)
>
> オイラ VB は知らんので C# なら
>
> static void Main(string[] args)
> {
> string[] sval = { "08", "D7", "46", "CB", "77", "E4", "C0", "00" };
> long v = 0;
> foreach (var s in sval)
> {
> v = (v << 8) | byte.Parse(s, System.Globalization.NumberStyles.HexNumber);
> }
> Console.WriteLine(v.ToString("X8"));
> }
>
> これがどっちの形式変換なのか理解できれば逆方向の変換も簡単だろうと思うの心
>

返答ありがとうございます。
C#での細かい回答ありがとうございます。
C#での開発も行っているので参考にさせていただきます。
解決済み
引用返信 編集キー/
■92571 / inTopicNo.7)  Re[3]: 16進数からLong型への変換
□投稿者/ usushio (34回)-(2019/10/08(Tue) 09:15:58)
No92569 (usushio さん) に返信
> ■No92536 (魔界の仮面弁士 さん) に返信
>>■No92535 (usushio さん) に返信
> >>String型配列に{"08","D7","46","CB","77","E4","C0","00"}
> >>と入っています。
> >>この文字列を一列に結合しLong型に変換を行おうとしておりますが
> >>CLng関数では有効範囲を超えてしまいます。
>>
>>ビッグエンディアン と リトルエンディアン とで。
>>
>>Dim usushio As String() = {"08", "D7", "46", "CB", "77", "E4", "C0", "00"}
>>
>>'&H08D746CB77E4C000UL (= 637,055,712,000,000,000 )
>>Dim v1 As Long = Convert.ToInt64(String.Join("", usushio), 16)
>>Dim v2 As ULong = Convert.ToUInt64(String.Join("", usushio), 16)
>>
>>'&H00C0E477CB46D708UL (= 54,294,398,691,104,520 )
>>Dim v3 As Long = Convert.ToInt64(String.Join("", usushio.Reverse()), 16)
>>Dim v4 As ULong = Convert.ToUInt64(String.Join("", usushio.Reverse()), 16)
>
>
返答ありがとうございます。
今回はビッグエンディアンの方法を探しておりました!
ありがとうございます。
解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ