2008-10-21 9 views
7

मेरे पास एक चर है जिसमें 4 बाइट, नेटवर्क-ऑर्डर आईपीवी 4 पता है (यह पैक और पूर्णांक प्रतिनिधित्व का उपयोग करके बनाया गया था)। मेरे पास एक और चर है, एक 4 बाइट नेटवर्क-ऑर्डर, सबनेट भी है। मैं उन्हें एक साथ जोड़ने की कोशिश कर रहा हूं और सबनेट में पहला आईपी प्राप्त करने के लिए एक जोड़ रहा हूं।पर्ल में बाइनरी स्ट्रिंग में जोड़ने का सबसे आसान तरीका क्या है?

ASCII प्रतिनिधित्व प्राप्त करने के लिए, मैं inet_ntoa($ip&$netmask) कर सकते हैं आधार का पता पाने के लिए, लेकिन यह inet_ntoa((($ip&$netmask)+1) करने के लिए एक त्रुटि है; मैं एक संदेश की तरह:

Argument "\n\r&\0" isn't numeric in addition (+) at test.pm line 95. 

तो क्या हो रहा है, सबसे अच्छा के रूप में मैं बता सकता हूँ, यह 4 बाइट में दिख रही है, और देखना है कि 4 बाइट में सांख्यिक स्ट्रिंग का प्रतिनिधित्व नहीं करते, और उसके बाद करने से इनकार जोड़ें 1.

इसे डालने का एक और तरीका: मैं इसे क्या करना चाहता हूं, कम से कम महत्वपूर्ण बाइट में 1 जोड़ना है, जो मुझे पता है चौथा बाइट है? यही है, मैं स्ट्रिंग \n\r&\0 लेना चाहता हूं और \n\r&\1 स्ट्रिंग के साथ समाप्त करना चाहता हूं। ऐसा करने का सबसे आसान तरीका क्या है?

क्या वेरिएबल को अनपैक और पुनः पैक किए बिना ऐसा करने का कोई तरीका है?

उत्तर

13

क्या हो रहा है यह है कि आप $ip&$netmask के साथ बाइट स्ट्रिंग बनाते हैं, और उसके बाद इसे एक संख्या के रूप में पेश करने का प्रयास करें। यह काम करने वाला नहीं है, जैसे। आपको inet_ntoa पर फ़ीड करना है।

pack("N", unpack("N", $ip&$netmask) + 1) 

मुझे नहीं लगता कि यह करने के लिए एक सरल तरीका है।

+0

मैं तुम्हें सही हो सकता है लगता है। बस यह देखने की कोशिश कर रहा था कि कोई आसान तरीका है, लेकिन हां, ऐसा नहीं हो सकता है। –

8

भ्रमित पूर्णांक और तार। शायद निम्न कोड में मदद मिलेगी:

use Socket; 

$ip = pack("C4", 192,168,250,66); # why not inet_aton("192.168.250.66") 
$netmask = pack("C4", 255,255,255,0); 

$ipi = unpack("N", $ip); 
$netmaski = unpack("N", $netmask); 

$ip1 = pack("N", ($ipi&$netmaski)+1); 
print inet_ntoa($ip1), "\n"; 

कौन सा आउटपुट:

192.168.250.1 
संबंधित मुद्दे

 संबंधित मुद्दे