string - tamim - সি প্রোগ্রামিং সমস্যা ও সমাধান




স্ট্রিং বাইট অ্যারে রূপান্তর করার সেরা উপায় কি? (8)

Olny কর্মক্ষমতা টিউন জন্য ব্যবহার।

package main

import (
    "fmt"
    "reflect"
    "unsafe"
)

func BytesToString(b []byte) string {
    bh := (*reflect.SliceHeader)(unsafe.Pointer(&b))
    sh := reflect.StringHeader{bh.Data, bh.Len}
    return *(*string)(unsafe.Pointer(&sh))
}

func StringToBytes(s string) []byte {
    sh := (*reflect.StringHeader)(unsafe.Pointer(&s))
    bh := reflect.SliceHeader{sh.Data, sh.Len, 0}
    return *(*[]byte)(unsafe.Pointer(&bh))
}

func main() {
    b := []byte{'b', 'y', 't', 'e'}
    s := BytesToString(b)
    fmt.Println(s)
    b = StringToBytes(s)
    fmt.Println(string(b))
}

আমি string ডেটা একটি গুচ্ছ স্থানান্তর [100]byte পড়তে হবে।

কারণ string সবগুলি সঠিকভাবে 100 অক্ষর দীর্ঘ নয়, byte array অবশিষ্ট অংশটি 0 সেকেন্ডের সাথে প্যাড করা হয়।

যদি আমি [100]byte দ্বারা string করতে পারি: string(byteArray[:]) , tailing 0 গুলি ^@^@ s হিসাবে প্রদর্শিত হয়।

সি-তে string 0 শেষ হয়ে যাবে, তাই আমি আশ্চর্য আছি যে গোলাপের string জন্য byte array স্মার্টফাই হস্তান্তর করার সেরা উপায় কী।


আমি একটি recursive সমাধান সঙ্গে যখন।

func CToGoString(c []byte, acc string) string {

    if len(c) == 0 {
        return acc
    } else {
        head := c[0]
        tail := c[1:]
        return CToGoString(tail, acc + fmt.Sprintf("%c", head))
    }
}

func main() {
    b := []byte{some char bytes}
    fmt.Println(CToGoString(b, ""))
}

উদাহরণ স্বরূপ,

package main

import "fmt"

func CToGoString(c []byte) string {
    n := -1
    for i, b := range c {
        if b == 0 {
            break
        }
        n = i
    }
    return string(c[:n+1])
}

func main() {
    c := [100]byte{'a', 'b', 'c'}
    fmt.Println("C: ", len(c), c[:4])
    g := CToGoString(c[:])
    fmt.Println("Go:", len(g), g)
}

আউটপুট:

C:  100 [97 98 99 0]
Go: 3 abc

এখানে দ্রুত উপায়:

resp, _ := http.Get("https://www.something.com/something.xml")
bytes, _ := ioutil.ReadAll(resp.Body)
resp.Body.Close()
fmt.Println(string(bytes)) //just convert with string() function

কেন এই না?

bytes.NewBuffer(byteArray).String()

নিচের কোডটি '\ 0' সন্ধান করছে, এবং প্রশ্নটির অনুমানের অধীনে অ্যারের সবগুলি \ '0 \' পূর্বের সমস্ত '\ 0' থেকে সাজানো যেতে পারে। অ্যারেতে তথ্যটির মধ্যে '\ 0' থাকতে পারে তবে এই ধারনাটি ধরে রাখা হবে না।

বাইনারি অনুসন্ধান ব্যবহার করে প্রথম শূন্য-বাইটের অবস্থানটি খুঁজুন, তারপরে স্লাইস।

আপনি এই মত শূন্য-বাইট খুঁজে পেতে পারেন:

package main

import "fmt"

func FirstZero(b []byte) int {
    min, max := 0, len(b)
    for {
        if min + 1 == max { return max }
        mid := (min + max) / 2
        if b[mid] == '\000' {
            max = mid
        } else {
            min = mid
        }
    }
    return len(b)
}
func main() {
    b := []byte{1, 2, 3, 0, 0, 0}
    fmt.Println(FirstZero(b))
}

শূন্য-বাইটের জন্য অনুসন্ধান করা বাইট অ্যারেটি নিঃসন্দেহে দ্রুততর হতে পারে, বিশেষত যদি আপনার অধিকাংশ স্ট্রিং ছোট হয়।


যখন আপনি অ্যারের অ-নীল বাইটের সঠিক দৈর্ঘ্য জানেন না, তখন আপনি এটি প্রথমে ট্রিম করতে পারেন:

স্ট্রিং (bytes.Trim (arr, "\ x00"))


সরল সমাধান:

str := fmt.Sprintf("%s", byteArray)

আমি নিশ্চিত না যদিও এই অভিনয়কারী কিভাবে।





byte