2012-06-25 8 views
35

से [] बाइट से int में कैसे परिवर्तित करें मुझे टीसीपी पर क्लाइंट-सर्वर उदाहरण बनाने की आवश्यकता है। क्लाइंट साइड में मैंने 2 नंबर पढ़े और मैं उन्हें सर्वर पर भेजता हूं। मुझे जिस समस्या का सामना करना पड़ा वह यह है कि मैं []byte से int में परिवर्तित नहीं कर सकता, क्योंकि संचार केवल []byte के प्रकार को स्वीकार करता है।गो प्रोग्रामिंग

[]byte से int में कनवर्ट करने का कोई तरीका है या मैं सर्वर पर int भेज सकता हूं?

कुछ नमूना कोड वास्तव में सराहना की जाएगी।

धन्यवाद।

+0

के लिए यह करने के लिए उपयोग कर सकते हैं बस काम स्पष्ट करने के लिए, क्या आप क्लाइंट और सर्वर कोड दोनों लिख रहे हैं? और दोनों गो में लिखे गए हैं? – Sonia

+0

AFAIK आपको थोड़ा बदलाव करना है। – fiorix

+0

नेटवर्क पर डेटा भेजने के लिए इसे बाइट फॉर्म में होना चाहिए। – IanB

उत्तर

9

बाइट सरणी से शुरू करना आप रूपांतरण करने के लिए binary package का उपयोग कर सकते हैं।

उदाहरण के लिए आप ints पढ़ना चाहते हैं:

buf := bytes.NewBuffer(b) // b is []byte 
myfirstint, err := binary.ReadVarint(buf) 
anotherint, err := binary.ReadVarint(buf) 

एक ही पैकेज वांछित बाइट आदेश के साथ अहस्ताक्षरित int या तैरता के पढ़ने की अनुमति देता है,, सामान्य Read समारोह का उपयोग कर।

+8

वरिंट प्रोटोकॉल बफर के लिए विशिष्ट है और शायद वह नहीं है जिसे आप ढूंढ रहे हैं। स्पेक: http://code.google.com/apis/protocolbuffers/docs/encoding.html – fiorix

+0

बस स्पष्ट करने के लिए, 32 बिट पूर्णांक Varint द्वारा एन्कोड किए जाने के बाद 5 बाइट्स का उपयोग कर सकता है। – fiorix

+2

यह ओपी के उपयोग के मामले के लिए काम नहीं करता है। इसके बजाए 'बाइनरी। पढ़ें()' का प्रयोग करें। देखें: http://codereview.stackexchange.com/questions/15945/effectively-convert-little-endian-byte-slice-to-int32 – IanB

6

बाइट अनुक्रमों से/से एन्कोडिंग/डिकोडिंग संख्याओं के लिए, encoding/binary पैकेज है। दस्तावेज़ीकरण में उदाहरण हैं: सामग्री तालिका में उदाहरण अनुभाग देखें।

ये एन्कोडिंग फ़ंक्शन io.Writer इंटरफेस पर संचालित होते हैं। net.TCPConn प्रकार IO.Writer लागू करें, ताकि आप सीधे नेटवर्क कनेक्शन पर लिख/पढ़ सकें।

यदि आपके पास कनेक्शन के दोनों ओर एक गो प्रोग्राम है, तो आप encoding/gob का उपयोग करना चाह सकते हैं। गोब का उपयोग करने की पैदल यात्रा के लिए आलेख "Gobs of data" आलेख देखें (स्वयं को निहित उदाहरण देखने के लिए नीचे छोड़ें)।

+0

क्या आप एक उदाहरण दे सकते हैं कि टीसीपी एप्लिकेशन में गोब का उपयोग कैसे करें? – Emanuel

+0

मैंने एक लेख में एक लिंक जोड़ा है जो gobs का वर्णन करता है; यदि आप केवल एक कोड उदाहरण देखना चाहते हैं तो आप नीचे तक जा सकते हैं। जब आप एक एन्कोडर/डिकोडर बनाते हैं, तो आप 'gob.NewEncoder'/'gob.NewDecoder' के तर्क के रूप में' * TCPConn' में बस पास कर सकते हैं। – axw

35

(this answer reposting)

एन्कोडिंग/बाइनरी के ByteOrder 16, 32, 64 बिट प्रकार

Play

package main 

import "fmt" 
import "encoding/binary" 

func main() { 
    var mySlice = []byte{244, 244, 244, 244, 244, 244, 244, 244} 
    data := binary.BigEndian.Uint64(mySlice) 
    fmt.Println(data) 
} 
+1

ऑफसेट के बारे में कैसे? – majidarif

+0

ऑफ़सेट द्वारा आपका क्या मतलब है? जैसा कि, [] बाइट के बीच से पढ़ रहा है? बस BigEndian.Uint64 (bigSlice [10:18]) (मूल रूप से, स्लाइस के बीच में बाइट पढ़ें। या आप कुछ और मतलब है? –

+1

हां, मुझे बेवकूफ सवाल पूछने के बाद लगा। बस इसे संपादित नहीं कर सकता: डी धन्यवाद हालांकि। – majidarif

-7
var bs []byte 
value, _ := strconv.ParseInt(string(bs), 10, 64) 
+0

इस अनुमान के मुकाबले बहुत सारे वोट ले लिए गए हैं क्योंकि कोई स्पष्टीकरण नहीं है और यह int की बजाय int64 देता है। यदि आप int64 चाहते थे (मैं करता हूं) क्या यह एक वैध विधि होगी? रूपांतरण स्ट्रिंग करने के लिए एक अनावश्यकता की तरह लगता है। – robstarbuck

+0

यह समाधान '[] बाइट' से 'int64' में परिवर्तित करने के लिए काम करता है (जो मुझे चाहिए), तो क्या कोई गोलांग चिम में अनुभव कर सकता है और कह सकता है कि यह ठीक है या यदि कोई बेहतर तरीका है? धन्यवाद। –