/ / रूबी हालत सच / झूठी - रूबी, एन्कोडिंग, बाइट के बजाय शून्य वापस आती है

रूबी की स्थिति सही / झूठी - रूबी, एन्कोडिंग, बाइट के बजाय शून्य वापस आती है

मैं रूबी 2.0 का उपयोग कर रहा हूँ।0p451 (2014-02-24) [x64-mingw32] और मैं उस चीज़ पर आया जो पहले 1.9.x संस्करण में काम करता था जो यहां काम नहीं करता है। मैं सोच रहा था कि क्या उन्होंने व्यवहार बदल दिया है, या अगर मैं कुछ गलत कर रहा हूं, या यदि यह एक बग है।

मैं एक सॉकेट नीचे एक बाइट भेज रहा हूँ xFF और मैं इसे दूसरे छोर पर प्राप्त करता हूं, लेकिन जब मैं इसे स्वयं से तुलना करने की कोशिश करता हूं (जो सच होना चाहिए) यह अपेक्षित आउटपुट वापस नहीं करता है।

उदाहरण, मैं स्ट्रिंग भेजता हूं xFFx50x00usernamex00555x00 और मैं इसे दूसरे छोर पर ठीक करता हूं, लेकिन जब मैं पहली बाइट की तुलना करने की कोशिश करता हूं तो यह सशर्त व्यवहार गलत तरीके से व्यवहार करता है।

यहां कुछ कोड नमूने दिए गए हैं ताकि आप देख सकें कि मैं डेटा को कैसे प्रबंधित कर रहा हूं (प्रासंगिक कोड पर स्किम किया गया है)

class PacketReceiver
def setpacket( buffer ); @buffer = buffer; end
def getbyte
byte = @buffer[0..0]
@buffer = @buffer[1..-1]
byte
end
end

def parsepacket(packet)
#@receiver = PacketReceiver.new #defined elsewhere in code
@receiver.setpacket packet

return false unless @reciever.getbyte.eql? "xFF" #the bugged line

#Everything works beyond this point
packet_id = @reciever.getbyte

case packet_id
when "x50"
return sid_requesting_config
when "x51"
sid_requesting_data_response
when "x52"
sid_keep_alive_response
else
puts "failed"
return false
end
return true
end

1.9.एक्स में यह unless कथन ठीक काम कर रहा था। डेटा डीबग करते समय, लौटा हुआ डेटा @receiver.getbyte वास्तव में "एक्सएफएफ" है, लेकिन किसी कारण से eql? फ़ंक्शन झूठी वापसी के कारण वास्तविक की बजाय झूठी वापसी कर रहा है। अगर मैं संदेश से इस बाइट को हटा देता हूं और बाकी कोड को चेक भी हटा देता हूं getbyte विधि ठीक काम करता है।

इसके अलावा यदि मैं बाइट को सशर्त "xFF" के बजाय "x55" में बदलता हूं unless कथन काम करता है जैसा कि इसे करना चाहिए।

मुझे यकीन नहीं है कि क्या हो रहा है। क्या एक्सएफएफ कुछ के लिए आरक्षित है?

उत्तर:

जवाब के लिए 0 № 1

मैं अनुमान लगा रहा हूँ buffer बाइनरी एन्कोडेड है (यानी। buffer.encoding ASCII-8BIT है)। इसका मतलब है कि यह हो रहा है:

c  = @receiver.getbyte # c also has binary encoding
ff = "xff"            # ff is probably utf-8
c.eql? ff              # comparing strings in different encodings gives you `false`

इसके बजाय, आपको सरल संख्यात्मक तुलना करना चाहिए:

@receiver.getbyte.getbyte(0) == 255

या इससे भी बेहतर, संशोधित करें getbyte एक पूर्णांक वापस करने के लिए।

मुझे लगता है कि आपका 1.9.एक्स संस्करण ज्यादातर दुर्घटना से काम कर रहा था, आपको सभी के साथ एक साधारण संख्यात्मक तुलना का उपयोग करना चाहिए था।

ध्यान रखें कि आपके बफर में बाइट्स हैं (जैसे कि 0xFF और 0x00) जो utf-8 तारों में मान्य नहीं हैं, इसलिए आपको अपने बफर को बाइनरी में रखना चाहिए। आप उपयोग कर सकते हैं force_encoding यूएफएफ -8 स्ट्रिंग्स वाले हिस्सों के लिए बफर के स्लाइस पर। आप देखना चाहते हैं String#unpack भी।


ध्यान दें कि मैं रूबी 2.0.0 विशिष्ट दस्तावेज़ों से जुड़ा हूं जो रूबी संस्करण से मेल खाते हैं जो आप वर्तमान में उपयोग कर रहे हैं।