2013-06-23 4 views
3

Попытки превратить 8-битовую двоичную строку в байты (без знака)golang ParseInt int8 не беззнаковое

strconv.ParseInt("11111000", 2, 8) 

возврата 127

strconv.ParseInt("11111000", 2, 16) 

возвращает правильное число 248

В соответствии с ParseInt document, 8 означает int8, который идет от -128 до 127. Если да, почему бы не вернуть значение отрицательного числа?

ответ

3

Вы анализируете положительные знаковые целые числа, отрицательные целые числа с префиксом с минусом. Для целых чисел без знака проанализируйте как unsigned. Кроме того, всегда проверяйте наличие ошибок.

Например,

package main 

import (
    "fmt" 
    "strconv" 
) 

func main() { 
    // +127 
    i, err := strconv.ParseInt("01111111", 2, 8) 
    if err != nil { 
     fmt.Println(err) 
    } 
    fmt.Println(i) 
    // -128 
    i, err = strconv.ParseInt("-10000000", 2, 8) 
    if err != nil { 
     fmt.Println(err) 
    } 
    fmt.Println(i) 
    // +248 out of range for int8 
    i, err = strconv.ParseInt("11111000", 2, 8) 
    if err != nil { 
     fmt.Println(err) 
    } 
    fmt.Println(i) 
    // unsigned 248 in range for uint8 (byte) 
    u, err := strconv.ParseUint("11111000", 2, 8) 
    if err != nil { 
     fmt.Println(err) 
    } 
    fmt.Println(u) 
} 

Выход:

127 
-128 
strconv.ParseInt: parsing "11111000": value out of range 
127 
248 
0

ParseInt зажимы значения, которые являются слишком большими, чтобы максимально возможного значения для типа данных. Если вы проверите второе возвращаемое значение (код ошибки), вы увидите, что ему возвращается ошибка диапазона.