Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 将数据从uint8提取到双精度_C_Casting_Typeconverter_Unsigned Integer - Fatal编程技术网

C 将数据从uint8提取到双精度

C 将数据从uint8提取到双精度,c,casting,typeconverter,unsigned-integer,C,Casting,Typeconverter,Unsigned Integer,我有一个C函数,它接收一个带有另一个参数的uint8指针,该参数是它的大小(字节数) 我想从这个缓冲区提取double数据。这是我的密码: Write(uint8* data, uint8 size) /* data and size are given by a callback to my function)*/ { double d; for (i = 0; i < size; i++) { d = ((double*)&data)[i

我有一个C函数,它接收一个带有另一个参数的
uint8
指针,该参数是它的大小(字节数)

我想从这个缓冲区提取
double
数据。这是我的密码:

Write(uint8* data, uint8 size) /* data and size are given by a callback to my function)*/
{
    double d;
    for (i = 0; i < size; i++)
    {
        d = ((double*)&data)[i];
        printf(" d = %d\n");
    }
}
Write(uint8*数据,uint8大小)/*数据和大小由对my函数的回调给出)*/
{
双d;
对于(i=0;i

问题是我没有接收到在外部硬件中发送的内容。我猜我的演员阵容是错的。我尝试了其他方法,但没有任何好结果。我仍然无法获取我发送的内容。

假设您的数据实际上是一个双倍数组,并且大小是字节数,那么您的代码应该如下所示:

Write(uint8* data, uint8 size) /* data and size are given by a callback to my function)*/
{
  double d;
  int i;
  for (i=0; i<size/sizeof(double); ++i) {
    d = ((double*)data)[i];
    printf(" d = %g\n",d);
  }
}
printf(" d = %d\n");
那么您是说指向数据指针的指针是一个双指针

另外,您的printf语句如下所示:

Write(uint8* data, uint8 size) /* data and size are given by a callback to my function)*/
{
  double d;
  int i;
  for (i=0; i<size/sizeof(double); ++i) {
    d = ((double*)data)[i];
    printf(" d = %g\n",d);
  }
}
printf(" d = %d\n");

您告诉它打印一个整数(%d是一个整数),但没有给它一个实际的打印值。我将其更改为%g,它以最适合的格式打印一个double。

假设您的数据实际上是一个double数组,并且大小是字节数,您的代码应该如下所示:

Write(uint8* data, uint8 size) /* data and size are given by a callback to my function)*/
{
  double d;
  int i;
  for (i=0; i<size/sizeof(double); ++i) {
    d = ((double*)data)[i];
    printf(" d = %g\n",d);
  }
}
printf(" d = %d\n");
Write(uint8* data, uint8 size) /* data and size are given by a callback to my function)*/
 {

  double d;
  for (i=0; i<size; i++) {
  d = ((double*)data)[i];
  printf(" d = %d\n", d);
  }

 }
那么您是说指向数据指针的指针是一个双指针

另外,您的printf语句如下所示:

Write(uint8* data, uint8 size) /* data and size are given by a callback to my function)*/
{
  double d;
  int i;
  for (i=0; i<size/sizeof(double); ++i) {
    d = ((double*)data)[i];
    printf(" d = %g\n",d);
  }
}
printf(" d = %d\n");
您告诉它打印一个整数(%d是一个整数),但没有给它一个实际的打印值。我将其更改为%g,它以最适合的格式打印一个double。

Write(uint8*数据,uint8大小)/*数据和大小由对我的函数的回调给出)*/
Write(uint8* data, uint8 size) /* data and size are given by a callback to my function)*/
 {

  double d;
  for (i=0; i<size; i++) {
  d = ((double*)data)[i];
  printf(" d = %d\n", d);
  }

 }
{ 双d; 对于(i=0;i
Write(uint8*数据,uint8大小)/*数据和大小由对我的函数的回调给出)*/
{
双d;

对于(i=0;i如果我理解您的问题(不完全清楚是否最多有一个
double
要提取,或者可能有多个),我将尝试这样做:

double Write(uint8* data, uint8 size)
{
    double d;

    if (size < sizeof(d))
        return 0; // failure; you may want something smarter than this

    memcpy(&d, data, sizeof(d));

    return d;
}
双写(uint8*数据,uint8大小)
{
双d;
如果(尺寸
这避免了类似于
d=*(double*)数据的类型转换中的潜在对齐问题

如果数据不代表有效的
双精度
,特别是如果数据是反向的(例如,您的硬件是little-endian,运行此代码的CPU是big-endian或其他方式),则可能会以奇怪和丑陋的方式失败


我还不知道是否存在别名问题。需要再次阅读该标准。但在实践中从未见过这些问题。

如果我理解您的问题(不完全清楚是否最多有一个
要提取或可能有多个
),我将尝试以下操作:

double Write(uint8* data, uint8 size)
{
    double d;

    if (size < sizeof(d))
        return 0; // failure; you may want something smarter than this

    memcpy(&d, data, sizeof(d));

    return d;
}
双写(uint8*数据,uint8大小)
{
双d;
如果(尺寸
这避免了类似于
d=*(double*)数据的类型转换中的潜在对齐问题

如果数据不代表有效的
双精度
,特别是如果数据是反向的(例如,您的硬件是little-endian,运行此代码的CPU是big-endian或其他方式),则可能会以奇怪和丑陋的方式失败


我还不知道是否存在别名问题。需要再次阅读该标准。但在实践中从未见过它们。

您如何将
double
放入数据流?例如,您如何获得
uint8
,因为它可能以网络字节顺序排列,这可能与您的计算机字节顺序不同。几乎所有我关于这段代码的ng令人毛骨悚然。您收到的数据的确切格式是什么?正如Kerrek SB所说,这段代码有许多不同的问题。包括您的“printf()”不使用“d”。您如何将
double
放入数据流?也就是说,您如何获得
uint8
,因为它可能以网络字节顺序排列,这可能与您的计算机字节顺序不同。关于此代码的几乎所有内容都令人毛骨悚然。您接收的数据的确切格式是什么?正如Kerrek SB所说,有这段代码有很多不同的问题。包括您的“printf()”不使用“d”。您假设“data”是一个双精度数组,并且假设“size”是#/double。我们只是不知道-OP需要告诉我们。非常感谢..我有一个关于有符号/无符号不匹配的警告..我现在收到我发送的内容。但似乎我总是等于0。我没有关于大小和数据的文档..我所知道的是这些参数是从dll中提供给我的。我正在更改现有代码d使用TCP/IP和以太网连接。在我的实际配置中,我有两台计算机通过以太网连接。计算机1更改一个或多个变量,计算机2接收此数据。我认为数据表示计算机1中修改的变量,而不是所有计算机1变量的数组。您假设“数据”是一个双精度数组,假设“大小”是#/double。我们只是不知道-OP需要告诉我们。非常感谢..我有一个关于有符号/无符号不匹配的警告..我现在收到我发送的内容。但似乎我总是等于0。我没有关于大小和数据的文档..我所知道的是这些参数是从dll中提供给我的。我正在更改现有代码d通过以太网连接使用TCP/IP。在我的实际配置中,我有两台计算机通过以太网连接。计算机1更改一个或多个变量,计算机2接收此数据。我认为数据表示计算机1中修改的变量,而不是所有计算机1变量的数组。我认为此解决方案更安全!谢谢!没有什么是“安全的”,除非你确实知道实际的格式!否则,