วิธีง่าย ๆ ในการส่ง Integer ไปทาง TCP

2009-10-03 / C/C++ / 476 Comments

วันนี้ผมจะมาเขียนเรื่องวิธีง่าย ๆ ที่ผมใช้ส่ง Integer ไปทาง TCP
ซึ่งการส่งข้อมูลจะต้องถูกตัดออกเป็นไบต์ ๆ  ในการส่ง
ซึ่งตัวแปล Integer (ของ CPU 32 bit) จะมีขนาด 4 ไบต์ (8 x 4 = 32)
ซึ่งวิธีการที่ผมใช้การ Shift Bit เข้ามาช่วง ซึ่งทำให้การเขียนโปแรกมนั้นง่าย CPU ทำงานน้อย (น้อยกว่าวิธีการ ลบ และ mod)

สมุติเรามีข้อมูลแบบนี้
(3)00110011 (2)00111100 (1)10000001 (0)11110000  (ค่าเท่าไหร่ไม่ต้องไปสนใจ โดยเราจะใช้ชื่อแทนว่า Data)
เวลาเราส่งก็ต้องแยกออกเป็นไบต์ ๆ ได้แบบนี้

(0)11110000
(1)10000001
(2)00111100
(3)00110011

โดยเรียงจากไบต์ต่ำมาหาไบต์สูง

ซึ่งวิธีการได้ไบต์ต่างๆ  มาดังนี้
(0)11110000 = (Data & 00000000 00000000 00000000 11111111)
(1)10000001 = (Data & 00000000 00000000 11111111 00000000) >> 8
(2)00111100 = (Data & 00000000 11111111 00000000 00000000) >> 16
(3)00110011 = (Data & 11111111 00000000 00000000 00000000) >> 24

จากตัวอย่างจะเป็นได้ว่า เรานำ Data มา & กับค่าตัวเลขชุดนึงเพื่อกำจัดค่าในไบต์อื่นที่เราไม่ต้องการออกไป แล้ว Shift Bit เพื่อให้ได้ไบต์ที่เราต้องการมาอยู่ในไบต์ที่ 0
โดยจาก วิธีการนี้สามารถนำมาเขียนเป็น c source code ได้ดังนี้ครับ

unsigned char splitInt2Byte(int data,unsigned char byteNumber)
{

return (data >> (8 * byteNumber)) & 0xFF;  
//return ((( 255 << (8*byteNumber)) & data) >>  (8*byteNumber));   //ค่า เท่ากัน
}

จบแล้วครับ หวังว่าจะเป็นประโยชน์ต่อใครหลายๆ คนครับ

ปล.ส่วนตัวแปลที่เป็น Double ก็ใช้วิธีการคล้าย ๆ นี้ครับ แต่จะแยกได้ทั้งหมด 8 ไบต์ครับ (CPU 32 bit)

Read More