将 []byte 切片转换为 []int 切片

Posted

技术标签:

【中文标题】将 []byte 切片转换为 []int 切片【英文标题】:Convert []byte slice to []int slice 【发布时间】:2022-01-19 12:29:55 【问题描述】:

下面的代码做了什么:

它访问给定的 URL 并使用由随机数组成的纯文本进行响应。目前数据是 slice []byte,但我想使用这些数据,所以我认为最好的解决方案是将数据转换为 slice []int。

我的代码来了:

func getRandomInt(w http.ResponseWriter, r *http.Request) 
    w.Header().Set("Content-Type", "application/json")

    resp, err := http.Get("https://www.random.org/integers/?num=5&min=1&max=10&col=1&base=10&format=plain&rnd=new")
    if err != nil 
        fmt.Println("No response from request")
    

    defer resp.Body.Close()
    body, err := ioutil.ReadAll(resp.Body) // response body is []byte

    if err != nil 
        fmt.Println(err)
    

    err = json.Unmarshal(body, &bodyInt)

    if err != nil 
        fmt.Println(err)
    

    //MY CONVERTER
    bodyInt := make([]int, len(body))
    for i, b := range body 
        bodyInt[i] = int(b)
    

    js, err := json.Marshal(bodyInt)
    if err != nil 
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    

    w.Write(js)
    fmt.Println("Endpoint Hit: getRandomInt")

我已经尝试自己进行一些转换。使用给定的 URL,我应该得到 1 到 10 范围内的 5 个数字。转换后得到的是 10 到 60 范围内的 10-11 个数字。

我做了一些测试,当body的结构如下图时,cnversion可以正常工作。

body = []byte1, 2, 3, 4, 5

所以我认为我从 url 响应中读取的数据格式略有不同,但不知道如何解决该问题。谢谢。

【问题讨论】:

字节片是一种字符串,我认为。 好吧。因此,即我可以迭代 body 的每个值,将其转换为字符串,然后使用 strconv.Atoi(s) 将其转换为整数。我觉得它可以工作:) 【参考方案1】:

如果你curl那个URL你可以清楚地看到响应不是JSON,所以你不应该这样对待它。

curl 'https://www.random.org/integers/?num=5&min=1&max=10&col=1&base=10&format=plain&rnd=new'
5
10
4
4
2

它只是一个以换行符分隔的整数列表,所以你应该这样对待它。

resp, err := http.Get("https://www.random.org/integers/?num=5&min=1&max=10&col=1&base=10&format=plain&rnd=new")
if err != nil 
    fmt.Println(err)
    return

defer resp.Body.Close()

body, err := io.ReadAll(resp.Body)
if err != nil 
    fmt.Println(err)
    return


lines := strings.Split(string(body), "\n")
numbers := []int
for i := range lines 
    line := strings.TrimSpace(lines[i])
    if line == "" 
        continue
    

    num, err := strconv.Atoi(line)
    if err != nil 
        fmt.Println(err)
        return
    
    
    numbers = append(numbers, num)


// do something with numbers

【讨论】:

以上是关于将 []byte 切片转换为 []int 切片的主要内容,如果未能解决你的问题,请参考以下文章

golang:将有序的数字切片转换为数字范围表示的字符串数组

如何将切片字符串中的单个字符转换为 Python 中的整数?

清华尹成带你实战GO案例(15)Go String与Byte切片之间的转换

go语言之字符串指针数组切片

如何将切片转换为数组引用?

为啥可以将切片分配给空接口但不能将其强制转换为相同的空接口