Saturday, April 08, 2006

[Ruby] แปลง float ให้อยู่ในรูป Single precision (IEEE 754)

วันนี้นั่งทดลอง convert Ingres JDBC Library ซึ่งเขียนด้วย java
ให้เป็น ruby code,
ไปเจอ code ของ Java อยู่อันหนึ่ง
Float.floatToIntBits(fValue);

method นี้ทำหน้าที่แปลง float value ให้อยู่ในรูป Single precision

ใน ruby ถ้าต้องการทำแบบเดียวกัน
[fValue].pack("g")


ใน ruby การแปลงเป็น binary format จะใช้
method pack ใน class Array
ส่วนการแปลงกลับจาก binary form ก็จะใช้
method unpack ใน class String

กรณีที่เราต้องเขียนโปรแกรมระดับ Network protocol,
bit-struct เป็น library ตัวหนึ่งที่ช่วยให้เรา pack กับ unpack ได้ง่ายขึ้น
ตัวอย่าง code ของ bit-struct
class IP < BitStruct
unsigned :ip_v, 4, "Version"
unsigned :ip_hl, 4, "Header length"
unsigned :ip_tos, 8, "TOS"
unsigned :ip_len, 16, "Length"
...
octets :ip_src, 32, "Source addr"
octets :ip_dst, 32, "Dest addr"
rest :body, "Body of message"
end

ip = IP.new
ip.ip_v = 4
ip.ip_hl = 5
ip.ip_tos = 0
...
p.ip_src = "192.168.1.4"
ip.ip_dst = "192.168.1.255"
ip.body = "This is the payload text."


Note: สำหรับคนที่ไม่คุ้นกับ ruby, unsigned ที่เห็นใน source ข้างบน
ไม่ใช่การประกาศ datatype แบบใน java หรือ c
แต่เป็นการเรียกใช้ class method เพื่อ dynamic generate instance method

Related link from Roti

No comments: