2011-09-09 15 views
0

another question中,用戶提供了一種通過UDP向QuartzComposer發送數據的方法。看起來QuartzComposer非常關注發送給它的字節數據的填充。特別是它要求每個發送的字符都以「\ 0 \ 0 \ 0」開頭。通過UDP和C++發送浮點數給QuartzComposer

我能嘲笑了一個快速的Python程序來解決這個問題:

from socket import * 

PORT = 50000 
N = 3.14159265358 

# connect to Quartz Composer on localhost port 50000 
s = socket(AF_INET, SOCK_DGRAM) 
s.bind(('', 0)) 
s.setsockopt(SOL_SOCKET, SO_BROADCAST, 1) 

for c in str(N): 
    out = out + '\0\0\0' + c 
s.sendto(out, ('225.0.0.0', PORT)) 

的關鍵部分,我需要在C++實現是墊浮點數位。這裏是一個快速的Python模擬了關鍵部分:

def padfloat(n): 
    out = '' 
    for c in str(n): 
     out = out + '\0\0\0' + c 
    return out 

if __name__ == '__main__': 
    print(padfloat(3.14159265358)) 

誠然,我的C++扒不那麼緊張,但我還是能夠使用升壓得到UDP啓動和運行,併發送一個硬編碼的消息「 0.7" :

// 
// Working C++ to Quartz Network Test 
// 

#include <cstdlib> 
#include <cstring> 
#include <iostream> 
#include <boost/asio.hpp> 

using boost::asio::ip::udp; 

enum { max_length = 1024 }; 

int main(int argc, char* argv[]) 
{ 
    try 
    { 
boost::asio::io_service io_service; 

udp::socket s(io_service, udp::endpoint(udp::v4(), 0)); 

udp::resolver resolver(io_service); 
udp::resolver::query query(udp::v4(), "225.0.0.0", "50000"); 
udp::resolver::iterator iterator = resolver.resolve(query); 

using namespace std; // For strlen. 

// TODO: alter code to take in any number 

for (;;) { 
    std::cout << "Press Any Key to send 0.7: "; 
    char request[max_length]; 
    std::cin.getline(request, max_length); 
    // size_t request_length = strlen(request); 
    char test [] = {0,0,0,'0',0,0,0,'.',0,0,0,'7','\0'}; 
    s.send_to(boost::asio::buffer(test, 12), *iterator); 
    std::cout << "Sent\n"; 
} 
    } 
    catch (std::exception& e) 
    { 
std::cerr << "Exception: " << e.what() << "\n"; 
    } 
    return 0; 
} 

的相當瑣碎的問題,我需要的是如何採取一個浮點數和格式正確它作爲一個字符數組與送出幫助所有的‘\ 0 \ 0 \ 0’填充正確預置。我即將做些難看的事情,但如果有人能指點我一個優雅的修復,我會很開心學習一點。

+1

請問這個http://stackoverflow.com/questions/5016464/boostlexical-cast-conversion-double-to-string-c有幫助嗎? – Jackson

+0

似乎至少是一個很好的起點。 – speciousfool

回答

1

我沒有編譯器方便,但這應該是足夠的。

  1. 我們做字符串轉換
  2. 創建緩衝區大小的4倍(加1 null終止),在每4個位置初始化字符串中0
  3. 複製。

我不確定asio是否期望空終止符是它的大小的一部分,所以我遵循你的例子。

float float_value = 4.2f; 
std::string str = boost::lexical_cast<std::string>(float_value); 

std::vector<char> char_buff((str.size() * 4) + 1, 0); 

for (size_t i = 0; i < str.size(); i++) 
    char_buff[(i * 4) + 3] = str[i]; 

s.send_to(boost::asio::buffer(&char_buff[0], char_buff.size()), *iterator);