【问题标题】:go back from memcpy to double variable从 memcpy 返回到双变量
【发布时间】:2016-06-16 10:45:05
【问题描述】:

我有一个问题: 我正在通过使用 memcpy (在 C 中)并在 char 缓冲区中存储一个 double 变量来进行强制转换。我想要做的是将缓冲区内的字符转换回我的初始变量(双精度)。如果我转换缓冲区的每个位置,我得到ASCII字符的转换,而不是变量的真实值

我发布我的代码是为了更好地解决我的问题:

int counter = 1;
double pippo = 100.0;                       
const int cPacketSizeInBytes = 40;      
char packet[cPacketSizeInBytes]; 
do
{
    .....;
    .....;
    memcpy(&packet[32], (char*)&pippo, sizeof(double));
    serverSocket.Send((char*)&packet, cPacketSizeInBytes);
    pippo += 3.0;
    if ( pippo > 180.0 ) pippo = 0.0;
    counter++;

    if(!(counter%100))
    {
        printf("Pippo value (double) is : %f\n", pippo);

        for (int i = 32; i < 40; i ++) {
            printf("%c\n", packet[i]);
            double x = (double)packet[i];
            printf("%f\n", x);
        }
    }
}

xpacket[i]..中ASCII字符的双重转换 如何合并数据包内的所有字符(即packet[32....39])以获取pippo的值?

【问题讨论】:

  • 您使用memcpy 对数据包进行编码,那么为什么不再次使用一个对数据包进行解码呢? double x; memcpy(&amp;x, packet + 32, sizeof(double));
  • 谢谢!我会努力的!
  • 如果我的变量位于数据包的中间(即从位置 8 到位置 15)怎么办...我必须使用 sintax "memcpy(&x, packet + 8, sizeof(双倍的));” ??它能够从位置 8 读取到 15 或者我必须定义结束位置?
  • 你测试了吗?不检查标准,我想应该没问题。
  • 我测试了它,但它似乎没有考虑变量的增量(即,我总是在 memcpy 调用之后和之前的变量之间的差异等于增量( +3.0))。现在 pippo 在缓冲区中从位置 8 到 15(8 个字节,双精度) if(!(counter%100)) { printf("Pippo value (double) is : %f\n", pippo); memcpy(&pippo, 数据包 + 8, sizeof(double)); printf("我以 %lf\n 的形式返回 pippo 值", pippo);

标签: c char double ascii memcpy


【解决方案1】:

请注意,当您在套接字上发送内容时,您必须考虑字节序,否则您可能会得到错误的值。

我建议你使用“htonl”、“ntohl”之类的函数,因为这样的函数就是为此而设计的。

编辑:你的 memcpy 假设你的 double 是 4 个八位字节,所以主要是 x32 位机器。如果您的代码在 x64 架构上运行,我认为它会失败。 抱歉!错了。

【讨论】:

  • "你的 memcpy 假设你的 double 是 4 个八位字节,"为什么?在我的理解中,double 通常为 8 字节长,如果 sizeof(double) 为 8,则代码看起来很好。
  • 我没有看到任何 4 字节的假设。此外,double 在 x86 和 x64 上是 8 个字节。机器位数不影响它。
  • 如果我的变量位于数据包的中间(即从位置 8 到位置 15)怎么办...我必须使用 sintax "memcpy(&x, packet + 8, sizeof(双倍的));” ??
  • 我的错,我混淆了一些价值并最终说错了话。谢谢,我会编辑我的答案。
猜你喜欢
  • 1970-01-01
  • 2019-05-16
  • 1970-01-01
  • 1970-01-01
  • 2023-03-26
  • 1970-01-01
  • 1970-01-01
  • 2023-03-16
  • 1970-01-01
相关资源
最近更新 更多