【问题标题】:Break double into chars using pointers?使用指针将双字符分解为字符?
【发布时间】:2011-11-23 23:23:55
【问题描述】:

我可以将指向双精度的指针转换为char * 类型,然后使用该指针将双精度分成字节吗?

下面是示例代码:

double data;
double *dblPoint = &data;
unsigned char *bytePoint = (unsigned char *)dblPoint;
unsigned char byteArray[sizeof (double)];
unsigned int i;

for(i = 0; i < sizeof(double); i++) {
    byteArray[i] = *(bytePoint + i);
}

byteArray 然后通过 UART 传输到另一台计算机并重建(bytesReceived 包含传入数据):

unsigned char bytesReceived[sizeof (double)];

double reconstData;
double *newDblPoint;
unsigned int i;

newDblPoint = bytesReceived;
reconstData = *dblPoint;

那么,毕竟,data == reconstData

【问题讨论】:

    标签: c pointers types casting


    【解决方案1】:

    是的,你基本上可以做到这一点。需要注意的一个问题是,如果两台机器的字节顺序不同,那么您将需要在一侧反转字节顺序。

    【讨论】:

      【解决方案2】:

      您的第一个示例可以简化为:

      double data;
      unsigned char bytesReceived[sizeof double];
      memcpy ( bytesReceived, &data, sizeof data);
      

      您的第二个示例无效:缓冲区

      unsigned char bytesReceived[sizeof double];
      

      不一定在“双”边界上对齐,因此演员表

      newDblPoint = bytesReceived;
      reconstData = *dblPoint;
      

      将尝试取消引用未对齐的指针。

      【讨论】:

      • 我将如何确保它正确对齐?
      • 最干净的方法是使用联合。但是您不需要指针转换; memcpy 已经足够好了。
      【解决方案3】:

      请参阅C99 Standard 中的 6.2.6.1/4。

      基本上,它表示将任何对象复制到unsigned char 的数组中是合法的,并得到它的对象表示

      如果两台机器之间的双精度对象表示相同,那么您将在第二台机器上获得与在第一台机器上开始时相同的值。

      我会使用 memcpy 而不是循环

      memcpy(byteArray, &data, sizeof data);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-01
        • 1970-01-01
        • 2013-01-01
        相关资源
        最近更新 更多