2016-08-01 88 views
0

我想添加一個用戶可以輸入數字的文本框。無論數量多大或多少,都需要存儲爲雙倍數據。然後用一個點擊按鈕,等價的十六進制將顯示在第二個文本框中。如果您可以告訴我如何獲取16字節的十六進制並將其更改爲4個變量(每個變量爲4個字節),則可獲得獎勵點。任何方式將從Double轉換爲Hex在vb中?

例如,用戶在textbox1中輸入1234.56。點擊按鈕1,textbox2顯示十六進制equivilent「40934A3D70A3D70A」然後取出該字符串,並提取到4個不同的4字節字符串,以便str1 = 1093,str2 = 4A3D,str3 = 70a3,str4 = d70A。

+2

什麼語言你想這樣做嗎?你用3個完全不同的標籤標記了它。 – Comintern

+0

感謝您對StackOverflow的問題!請注意,這是一個有效的問題,但不是一個很好的問題。一個簡單的查詢與您所選擇的搜索引擎應該在'C#'中給出很多結果,即使在這裏可以很容易地轉換爲'vb.net'的StackOverflow ... – ventiseis

+0

對不起,我正在尋找一個解決方案視覺基本。 –

回答

1

你是在找BitConverterC#實現:

double source = 1234.56; 

// 40934A3D70A3D70A 
string result = string.Concat(BitConverter 
    .GetBytes(source) 
    .Reverse() 
    .Select(b => b.ToString("X2"))); 

已經得到了result,與Substring提取其部分:

string str1 = result.Substring(0, 4); 
string str2 = result.Substring(4, 4); 
string str3 = result.Substring(8, 4); 
string str4 = result.Substring(12, 4); 
0

如果你正在尋找一個C#實現,試試這個:

static void Main(string[] args) 
    { 
     var number = 1234.56; 
     string hex = DoubleToHex(number); 
     string part1 = hex.Substring(0, 4); 
     string part2 = hex.Substring(4, 4); 
     string part3 = hex.Substring(8, 4); 
     string part4 = hex.Substring(12, 4); 
    } 

    internal static string DoubleToHex(double value) 
    { 
     var b = BitConverter.GetBytes(value).Reverse(); 
     string result = string.Join(string.Empty, b.Select(i => i.ToString("X2")).ToArray()); 

     return result; 
    } 
0

這是您將得到最有效的答案:

unsafe static void Main() 
{ 
    var value = 1234.56; 
    var pLong = (long*)&value; 
    var fullString = (*pLong).ToString("X"); 
    var pShort = (short*)pLong; 
    short value0 = *pShort, value1 = *(pShort + 1), value2 = *(pShort + 2), 
      value3 = *(pShort + 3); 
    string s0 = value0.ToString("X"), s1 = value1.ToString("X"), s2 = value2.ToString("X"), 
      s3 = value3.ToString("X"); 

    Debug.Print(fullString); 
    Debug.Print(s0); 
    Debug.Print(s1); 
    Debug.Print(s2); 
    Debug.Print(s3); 
} 

輸出: 40934A3D70A3D70A

D70A

70A3

4A3D

0

嘗試:DoubleToHex

  //dashseparator 0 /2/4 
     public string DoubleToHex(double d, bool reverse = false, int dashSeparator = 0) 
     { 
      byte[] bytes = BitConverter.GetBytes(d); 
      if (reverse) bytes = bytes.Reverse().ToArray(); 
      var hex = BitConverter.ToString(bytes); 
      var hex4 = ""; 
      if (dashSeparator == 2) return hex; 
      if (dashSeparator == 4) 
      { 
       hex = hex.Replace("-", ""); 
       hex = Regex.Replace(hex, ".{4}", "$0-").TrimEnd('-'); 
       return hex; 
      } 
      return hex.Replace("-", ""); 
     } 

樣本輸出:

Double: 1234.56 
Hex:     0AD7A3703D4A9340 
Hex in Reverse order: 40934A3D70A3D70A 
Hex in Reverse order separate by 2 digits: 40-93-4A-3D-70-A3-D7-0A 
Hex in Reverse order separate by 4 digits: 4093-4A3D-70A3-D70A 

可以:

- 控制所述產生的十六進制顯示在順序/反向順序。由0(無隔膜)

-Add破折號分離器/ 2/4位

編輯:

Vb.Net版

轉換代碼以Vb.Net

'dashseparator 0 /2/4 
Public Function DoubleToHex(d As Double, Optional reverse As Boolean = False, Optional dashseparator As Integer = 0) As String 
Dim bytes As Byte() = BitConverter.GetBytes(d) 
If reverse Then 
    Array.Reverse(bytes) 
End If 
Dim hex = BitConverter.ToString(bytes) 
Dim hex4 = "" 
If dashseparator = 2 Then 
    Return hex 
End If 
If dashseparator = 4 Then 
    hex = hex.Replace("-", "") 
    hex = Regex.Replace(hex, ".{4}", "$0-").TrimEnd("-"C) 
    Return hex 
End If 
Return hex.Replace("-", "") 
End Function 
0

Dmitry Bychenko的翻譯回答VB.NET

Imports SplitValue = System.Tuple(Of String, String, String, String) 

Module Module1 

    Function DoubleToByteArray(ByVal AValue As Double) As Byte() 
     Return BitConverter.GetBytes(AValue).Reverse().ToArray() 
    End Function 

    Function SplitByteArray(ByRef AValue As Byte()) As SplitValue 
     Dim StringValue As String = String.Join("", From AByte In AValue Select AByte.ToString("X2")) 
     Return New SplitValue(StringValue.Substring(0, 4), StringValue.Substring(4, 4), StringValue.Substring(8, 4), StringValue.Substring(12, 4)) 
    End Function 

    Sub Main() 
     Dim Result As SplitValue 
     Result = SplitByteArray(DoubleToByteArray(1234.56)) 
     Console.WriteLine(Result) 
     Console.ReadLine() 
    End Sub 

End Module 

輸出:

(4093, 4A3D, 70A3, D70A)