1

私が開発した関数の完全なコードは次のとおりです。

package main

import (
    "database/sql"
    "log"
    "encoding/xml"
    "github.com/gin-gonic/gin" //golang frameworks
    _ "github.com/go-sql-driver/mysql"
    "gopkg.in/gorp.v1"        //work with database(mysql, etc.)
)

type Genre struct {
    Title string `xml:"genre"`
}

type GenreArray struct {
    Auth_state int `xml:"auth_state"`
    Count int64 `xml:"count"`
    Item genreAPI `xml:"item"`
}

type UserPass struct {
    Username string `xml:"username"`
    Password string `xml:"password"`
}

type ErrorMessage struct {
    XMLName xml.Name `xml:"error"`
    Error string `xml:"error_code"`
    Message string `xml:"message"`
}

type Auth struct {
    XMLName xml.Name `xml:"config"`
    Nas_SharingEmpty  int `xml:"nas_sharing>auth_state"`
}

type ConfigGenre struct {
    XMLName xml.Name `xml:"config"`
    Nas_Sharing  GenreArray `xml:"nas_sharing"`
}

type genreAPI []Genre

var dbmap = initDb()

func initDb() *gorp.DbMap {

    db, err := sql.Open("mysql", "root@tcp(localhost:3306)/mymusic")
    checkErr(err, "sql.Open failed")
    dbmap := &gorp.DbMap{Db: db, Dialect: gorp.MySQLDialect{"InnoDB", "UTF8"}}

    return dbmap
}

func checkErr(err error, msg string) {
    if err != nil {
        log.Fatalln(msg, err)
    }
}

func main() {
    r := gin.Default()
    r.POST("/nas_sharing", myMusicXML)
    r.Run(":9999")
}

func myMusicXML(c *gin.Context) {

    c.Request.ParseForm()
    cmd := c.Request.Form.Get("cmd")
    usernamepost := c.Request.Form.Get("user")
    passwordpost := c.Request.Form.Get("passwd")

    if cmd == "36" {
    //Music Genre List API

        var genre []Genre
        var userpass []UserPass
        var count int64
        var countAuth int64

        //Query the post username and password
        _, errAuth := dbmap.Select(&userpass, "SELECT username, password FROM user WHERE username=? and password=?", usernamepost, passwordpost)

        //Check if post username and password exist
        countAuth, errAuth = dbmap.SelectInt("select count(*) FROM user WHERE username=? and password=?", usernamepost, passwordpost)
        if countAuth == 0 {
            //If no rows detected, output a message
            c.XML(404, Auth{Nas_SharingEmpty: 0})
        }else{
            //Check if query is valid
            if errAuth == nil {
                log.Println("auth_state :", countAuth)
            }else{
                c.XML(404, gin.H{"error": "sql query error found"})
            }

            //Query genre list
            _, err := dbmap.Select(&genre, "SELECT Title FROM genre_cntr_tbl")

            //Count genres
            count, err = dbmap.SelectInt("select count(*) FROM genre_cntr_tbl")
            if count == 0 {
                //If no rows detected, output a message
                c.XML(404, ErrorMessage{Error:"404", Message: "no genre found"})
            }else{
                //Check if query is valid
                if err == nil {
                    log.Println("Genres :", genre)
                    c.XML(200, ConfigGenre{Nas_Sharing: GenreArray{Auth_state: 1, Count: count, Item: genre,}})
                }else{
                    c.XML(404, gin.H{"error": "sql query error found"})
                }
            }
        }
    }else{
        c.XML(404, ErrorMessage{Error:"404", Message: "command not found"})
    }
}

出力は次のとおりです。

<config>
<nas_sharing>
    <auth_state>1</auth_state>
    <count>8</count>
    <item>
        <genre>Pop</genre>
    </item>
    <item>
        <genre>Rock</genre>
    </item>
    <item>
        <genre>Dance</genre>
    </item>
    <item>
        <genre>Opera</genre>
    </item>
    <item>
        <genre>Techno</genre>
    </item>
    <item>
        <genre>Hip Hop</genre>
    </item>
    <item>
        <genre>Jazz</genre>
    </item>
    <item>
        <genre>Reggae</genre>
    </item>
</nas_sharing>

ログへの私の出力のジャンルの値は次のとおりです(注:データベースからのものです):

Genres : [{Pop} {Rock} {Dance} {Opera} {Techno} {Hiphop} {Jazz} {Reggae}]  

ただし、出力をbase64形式に変換したいと思います。base64 にエンコードするためのサンプル コードを次に示しますが、これに指定されたデータstringは、私が開発した配列から取得したものとは異なります。どうすればその出力を達成できますか?

data := "/MyMusic/images/_albums/albums_nophoto.png"
sEnc := b64.StdEncoding.EncodeToString([]byte(data))
fmt.Println(sEnc)

これが私が期待した出力です

<config>
<nas_sharing>
    <auth_state>1</auth_state>
    <count>8</count>
    <item>
        <genre>UG9w</genre>
    </item>
    <item>
        <genre>Um9jaw==</genre>
    </item>
    <item>
        <genre>RGFuY2U=</genre>
    </item>
    <item>
        <genre>T3BlcmE=</genre>
    </item>
    <item>
        <genre>VGVjaG5v</genre>
    </item>
    etc...
4

1 に答える 1

3

序文: 最初のセクションでは、元の質問に答えます (配列を Base64 にエンコードします)。string出力で個々のフィールドを Base64 文字列として表示するだけの場合は、2 番目のセクションを参照してください。


a[]stringを Base64 形式にエンコードする

Base64 はエンコーディングであり、明確に定義された小さな文字セットを使用して、任意のバイト シーケンスをテキストに変換するために使用される関数です。

[]stringしたがって、配列またはスライスを一連のバイトに変換する方法を決定/考案する必要があります。

簡単で便利な方法は、JSON テキストに変換することです。これにより、たとえば[]string引用符を含む文字列のエスケープも処理されます。"結果stringは、説明した方法を使用して簡単にエンコードできます。

genre := []string{"Pop", "Rock", "Dance", "Opera", "Techno", "Hiphop", "Jazz", "Reggae"}

data, _ := json.Marshal(&genre)
fmt.Println(string(data))
sEnc := base64.StdEncoding.EncodeToString(data)
fmt.Println(sEnc)

出力 ( Go Playgroundで試してください):

["Pop","Rock","Dance","Opera","Techno","Hiphop","Jazz","Reggae"]
WyJQb3AiLCJSb2NrIiwiRGFuY2UiLCJPcGVyYSIsIlRlY2hubyIsIkhpcGhvcCIsIkphenoiLCJSZWdnYWUiXQ==

デコード

このような Base64 の結果があれば、次のようにデコードできます。

data2, err := base64.StdEncoding.DecodeString(sEnc)
if err != nil {
    panic(err)
}
var genre2 []string
if err = json.Unmarshal(data2, &genre2); err != nil {
    panic(err)
}
fmt.Println(genre2)

出力:

[Pop Rock Dance Opera Techno Hiphop Jazz Reggae]

ノート:

もちろん、他の変換を選択[]stringしてバイト シーケンスに変換することもできます。XML に変換したり、 またはその他のものを使用しencoding/binaryたりできます。JSON を選択したのは、JSON がワンライナーで、コンパクトで、高速であり、ほぼすべてのプログラミング言語でサポートされているためです。別のプログラムがデコードしなければならない場合でも問題ありません。

個々のstringフィールドを Base64 として表示する

Marshalerこれを行うには、次のように型 (または を囲むstruct)にインターフェイスを実装します。

func (g *Genre) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
    g2 := *g
    g2.Title = base64.StdEncoding.EncodeToString([]byte(g.Title))
    return e.EncodeElement(g2, start)
}

基本的に、これは のコピーを作成し、(コピーの) フィールドの値を元の値の Base64 表現にGenre変更し、このコピーをエンコードします。Title

出力 (部分)、Go Playgroundで試してください:

<GenreArray>
    <item>
        <genre>UG9w</genre>
    </item>
    <item>
        <genre>Um9jaw==</genre>
    </item>
</GenreArray>
于 2015-06-10T06:09:29.190 に答える