2016-08-01 87 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)