2012-10-02 52 views
0

我有一個C函數,接收uint8指針,其中的另一個參數是它的大小(字節數)。從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"); 
    } 
} 

問題是我沒有收到我在外部硬件內發送的內容。我想我的演員是錯的。我嘗試了其他方法,但沒有任何好的結果。我仍然無法得到我發送的內容。

+1

你怎麼把'double'放到數據流中? I.E.你如何得到'uint8',因爲它可能是網絡字節順序,可能與你的計算機字節順序不同。 – sean

+1

幾乎所有關於此代碼的內容都是提高頭髮的。您收到的數據的確切格式是什麼? –

+0

就像Kerrek SB所說,這個代碼有很多不同的問題。包括你的「printf()」不使用「d」的事實。 – paulsm4

回答

0

如果我明白你的問題(這是不完全清楚如果有至多一個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; 
} 

什麼這樣就避免了在像d = *(double*)data一個鑄件的潛在的對齊問題。

這可能會在奇數和醜陋的方式失敗,如果數據不表示一個有效的double,特別是如果它是相反的(例如,您的硬件是小端和運行該代碼的CPU是大端或其他方式) 。

我不知道如果別名問題適用。需要再次閱讀標準。雖然從未在實踐中看到過它們。

+0

我認爲這種解決方案更安全!謝謝! –

+0

*除非您確切知道實際的格式,否則*無*是「安全的」!否則,你只是猜測。而「猜測」總是不好。恕我直言... – paulsm4

2

假設你的數據實際上是雙打和大小的數組的字節數,你的代碼應該是這個樣子:

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); 
    } 
} 

最有可能的,大小是字節數,而不是數量雙打,所以你必須用雙的大小來劃分的大小來獲得雙打的實際數量:

如果你這樣做:

d = ((double*)&data)[i]; 

那麼你是說,指向數據的指針是一個雙指針。

而且,你的printf語句是這樣的:

printf(" d = %d\n"); 

你告訴它打印一個int(%d是一個int),而不是給它的實際值進行打印。我將其改爲%g,以最適合的格式打印雙精度。

+0

你*假設*「數據」是一個雙數組,並且*假設*「大小」是#/雙打。我們根本不知道 - OP需要告訴我們。 – paulsm4

+0

非常感謝。我對已簽名/未簽名不匹配發出了警告。我收到我現在發送的內容。但似乎我總是等於0。 –

+0

我沒有關於大小和數據的文檔..所有我知道的是這些參數是從一個DLL給我的。我正在改變現有的處理TCP/IP與以太網連接的代碼..在我的實際配置中,我有兩臺通過以太網連接的計算機。計算機1更改一個或多個變量,並且計算機2接收此數據。我認爲數據表示計算機1中的修改變量,而不是所有計算機1變量的數組。 –

1
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); 
    } 

} 

是你在找什麼即時猜測了,指針實際上是指向雙打的數組,所以你只投它正是