2011-09-09 5 views
0

another question에서 사용자는 UDP를 통해 QuartzComposer로 데이터를 보내는 방법을 제공했다. QuartzComposer는 전송 된 바이트 데이터의 채우기에 매우 특이한 것으로 보입니다. 특히 전송 된 각 문자 앞에 "\ 0 \ 0 \ 0"이 있어야합니다.C++로 UDP를 통해 QuartzComposer로 부동 소수점을 전송

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++에서 구현해야 할 중요한 부분은 부동 소수점 숫자 패드 비트입니다 :

나는이 문제를 해결하기 위해 빠른 파이썬 프로그램을 조롱 할 수 있었다.

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

내가 함께 보내 부동 소수점 숫자에 걸릴 제대로 char 배열로 서식을 지정하는 방법입니다 도움이 필요 오히려 사소한 문제가 모든"\ 0 \ 0 \ 0 " 올바르게 덧붙여진 패딩. 나는 추한 것을하려고합니다. 그러나 누군가가 저에게 우아한 고침을 가르쳐 줄 수 있다면, 조금 배우게되어 매우 행복 할 것입니다.

+1

이 답변에 대한 답변을 제공합니까? http://stackoverflow.com/questions/5016464/boostlexical-cast-conversion-double-to-string-c help? – Jackson

+0

최소한 좋은 출발점처럼 보입니다. – speciousfool

답변

1

필자는 컴파일러를 사용하지 않아도되지만 충분해야합니다.

  1. 우리는 모든 4 번째 위치에있는 문자열에서 0
  2. 복사 초기화 문자열 변환
  3. 버퍼 4 번 (널 종료 플러스 1) 크기를 만들기를 수행.

asio에서 null 종결자가 해당 크기의 일부가 될 것으로 예상되는지 모르겠으므로 예제를 따라갔습니다.

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); 
관련 문제