2012-03-06 60 views
0

我想双阵列,以字节数组和字节数组转换为双阵列转换为字节阵列,反之亦然

using System.Collections.Generic; 
using System.Collections; 
using System.Text; 
using System.Linq; 


namespace BitConversion 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      double[] Array = new double[] { 10.0, 20.0, 30.0, 40.0 }; 
      byte[] byteArray = GetBytesAlt(Array); 
      for (int i = 0; i < byteArray.Length; i++) 
      { 
       Console.Write(byteArray[i]); 
       Console.Write(","); 

      } 

      Console.WriteLine(); 

      double[] doubleArray = GetDoublesAlt(byteArray); 
      for (int i = 0; i < doubleArray.Length; i++) 
      { 
       Console.Write(doubleArray[i]); 
       Console.Write(","); 
      } 

      Console.WriteLine(); 

      Console.ReadLine(); 
     } 

     /// <summary> 
     /// convert to bytes 
     /// </summary> 
     /// <param name="values"></param> 
     /// <returns></returns> 
     static byte[] GetBytesAlt(double[] values) 
     { 
      /*var result = new byte[values.Length * sizeof(double)]; 
      Buffer.BlockCopy(values, 0, result, 0, result.Length); 
      return result;*/ 

      return values.SelectMany(value => BitConverter.GetBytes(value)).ToArray(); 

      //return values.SelectMany(value => BitConverter.GetBytes(value)).ToArray(); 

     } 

     static double[] GetDoublesAlt(byte[] bytes) 
     { 
      /* var result = new double[bytes.Length/sizeof(double)]; 
      Buffer.BlockCopy(bytes, 0, result, 0, bytes.Length); 
      return result;*/ 
      return Enumerable.Range(0, bytes.Length/sizeof(double)).Select(offset => BitConverter.ToDouble(bytes, offset * sizeof(double))).ToArray(); 

     } 
    } 
} 

使用convert接近当字节被转换回双打 的数字越来越10.0,20.0,30.0,40.0 .....

如何找回相同的数字?

我的意思是如果输入的双数是10.0,20.0,30.0,40.0, 而且我已经得到相同的数字是10.0,20.0,30.0,40.0。

+3

我不明白的问题。你说你回来了相同的号码,你想要回到相同的号码?我尝试了你的代码,确实得到了相同的数字。问题是什么? – zmbq 2012-03-06 06:33:35

+0

问题在这里只是'10'和'10.0'?如果是这样,那只是一个格式化的东西。无论哪种方式,它都是相同的**号码。如果你在'Array'上循环,你会发现'Array'给出''10,20,30,40'' – 2012-03-06 06:41:36

+0

我想打印数字为10.0 ... – Raghav55 2012-03-06 06:51:41

回答

1

程序没有问题 - 如果您稍微修改程序并打印原始以及往返数组,您确实会看到您获得相同的输出。 例如,

Original:  10.1,20.2,30,40, 
Round-trip:  10.1,20.2,30,40, 

这里是稍微修改代码

class Program 
    { 
     static void Main(string[] args) 
     { 
      double[] Array = new double[] { 10.1, 20.2, 30.0, 40.0 }; 
      Console.Write("Original:\t"); 
      PrintArray(Array); 

      byte[] byteArray = GetBytesAlt(Array); 
      double[] doubleArray = GetDoublesAlt(byteArray); 
      Console.Write("Round-trip:\t"); 
      PrintArray(doubleArray); 

      Console.ReadLine(); 
     } 

     static void PrintArray(Double[] array) 
     { 
      for (int i = 0; i < array.Length; i++) 
      { 
       Console.Write(array[i]); 
       Console.Write(","); 
      } 
      Console.WriteLine(); 
     } 

      // rest of methods are same 
      ... 
    } 
1

你得到正确的数字,它只是在写,你正在失去你的.0两个数字控制台是equivalant 。 10.0和10.这就是你的doubleArray在写之前的样子。

试着改变你的Console.Write声明如下:

for (int i = 0; i < doubleArray.Length; i++) 
    { 
     //Since you are forcing the .0 you need to make sure you have enough #'s 
     //for the level of precision you need. It is actually better to use the 
     //system default since 10.0 and 10 are functionaly equivalent. 

     Console.Write(doubleArray[i].ToString("##.0####")); 
     Console.Write(","); 
    } 
+0

还有一件事,这是字节coverage的最佳方式var result = new byte [values.Length * sizeof(double)]; Buffer.BlockCopy(值,0,结果,0,result.Length);返回结果; – Raghav55 2012-03-06 07:04:41

+0

@ Raghav55你在问什么,哪个更好? – 2012-03-06 07:18:48

+0

使用linq或使用blockcopy – Raghav55 2012-03-06 07:36:14

相关问题