[問題] 用VC去broadcast一組16進位數字

看板C_and_CPP (C/C++)作者 (大少爺)時間12年前 (2014/01/13 18:12), 編輯推噓3(3015)
留言18則, 3人參與, 最新討論串1/2 (看更多)
開發平台(Platform):VC++ VC++ 問題(Question): 如何broadcast一組16進位資料 餵入的資料(Input): 0xbb0000dd 預期的正確結果(Expected Output): 用wireshark可以看到Data部份是4byte,然後在16進位部份 會看到最後4byte是 bb 00 00 dd 錯誤結果(Wrong Output): 可以廣播、但最後4byte不正確 程式碼(Code): int _tmain(int argc, _TCHAR* argv[]) { if(argc < 2) { std::cout << "Error in Syntax: UDPServer.exe <port no> <msg>"; return 0; } int portno = ::_wtoi(argv[1]); USES_CONVERSION; // char *p = W2A(argv[2]); WORD w = MAKEWORD(1,1); WSADATA wsadata; ::WSAStartup(w, &wsadata); SOCKET s = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); if(s == -1) { std::cout << "Error in creating socket"; return 0; } char opt = 1; setsockopt(s, SOL_SOCKET, SO_BROADCAST, (char*)&opt, sizeof(char)); SOCKADDR_IN brdcastaddr; memset(&brdcastaddr,0, sizeof(brdcastaddr)); brdcastaddr.sin_family = AF_INET; brdcastaddr.sin_port = htons(portno); brdcastaddr.sin_addr.s_addr = INADDR_BROADCAST; int len = sizeof(brdcastaddr); // Byte[] msg = {0xbb,0x00,0x00,0xdd}; char sbuf[1024]; memset(sbuf,0,1024); sprintf_s(sbuf,8,"%1x%1x%1x%1x",(unsigned char)0xba,(unsigned char)0x00,(unsigned char)0x00,(unsigned char)0xba); printf("sbuf data:%x,%x,%x,%x\n",sbuf[0],sbuf[1],sbuf[2],sbuf[3]); std::cout << "sbuf len:\n"<<strlen(sbuf); int ret = sendto(s, sbuf, strlen(sbuf), 0, (sockaddr*)&brdcastaddr, len); //int ret = sendto(s, message, strlen(message), 0, (sockaddr*)&brdcastaddr, len); if(ret < 0) { std::cout << "Error broadcasting to the clients"; } else if(ret < strlen(sbuf)) { std::cout << "Not all data broadcasted to the clients"; } else { std::cout << "Broadcasting is done"; } ::closesocket(s); return 0; } 補充說明(Supplement): 此程式是在網路上撈到的,廣播部份是ok的,只是我一直無法將16進位 數字正確的廣播出去 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 118.163.2.22 ※ 編輯: cutem 來自: 118.163.2.22 (01/13 18:54) ※ 編輯: cutem 來自: 118.163.2.22 (01/13 18:55)

01/13 20:32, , 1F
%1x 不是傳那個字元值而是傳那個十六進位的字出去喔
01/13 20:32, 1F

01/13 20:32, , 2F
你要不要用 %c 試試看?
01/13 20:32, 2F

01/14 10:18, , 3F
試過了,結果不行,其實既然直接寫了0xba這種類型的資料進去
01/14 10:18, 3F

01/14 10:20, , 4F
buffer,那就表示不論你把他當成%c or %x,它的value都是我
01/14 10:20, 4F

01/14 10:21, , 5F
寫入的數字、只是若用%c去讀出來,就會對應ascii變成字元
01/14 10:21, 5F

01/14 10:21, , 6F
這樣寫在gcc應該沒問題,只是在vc環境中早於windows要解決
01/14 10:21, 6F

01/14 10:22, , 7F
unicode的問題,所以寫進去的和發出去的不一樣。
01/14 10:22, 7F

01/14 10:22, , 8F
我還在找解決的方法,有知道的板友還請指教一下、感謝您。
01/14 10:22, 8F

01/14 13:25, , 9F
byte 陣列跟 unicode 是兩回事...
01/14 13:25, 9F

01/14 13:26, , 10F
我覺得你就乾脆發送 byte 陣列好了
01/14 13:26, 10F

01/14 13:27, , 11F
經過字串這一手只會增加複雜度而已
01/14 13:27, 11F

01/14 13:46, , 12F
%1x 那邊看起來就很莫名其妙. 其實我看不懂他問題
01/14 13:46, 12F

01/14 14:48, , 13F
我對VC上寫程式很陌生、我是開了一個win32主控台應用程式專
01/14 14:48, 13F

01/14 14:49, , 14F
案,byte[]的方式我try過,可是VC告訴我沒有定義...
01/14 14:49, 14F

01/14 15:03, , 15F
signed char其實就是1Byte長度的data type了。
01/14 15:03, 15F

01/14 15:30, , 16F
後來我用生平第一支c#程式完成了我要的broadcast...
01/14 15:30, 16F

01/14 17:11, , 17F
呃, 我的意思確實是直接用元素是 1 byte 的陣列上...
01/14 17:11, 17F

01/14 17:12, , 18F
也就是說其實 signed char (或是 char) 的陣列就可以了
01/14 17:12, 18F
文章代碼(AID): #1Iqxm61L (C_and_CPP)
文章代碼(AID): #1Iqxm61L (C_and_CPP)