Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 当类型读取器作为输入提供时,gzip.NewReader()返回nil_Python_Go_Io_Null_Gzip - Fatal编程技术网

Python 当类型读取器作为输入提供时,gzip.NewReader()返回nil

Python 当类型读取器作为输入提供时,gzip.NewReader()返回nil,python,go,io,null,gzip,Python,Go,Io,Null,Gzip,我在解压缩以前压缩过的字节流时遇到了一个问题。基本上,我尝试使用函数bytes.NewReader()创建一个读卡器,然后使用gzip.NewReader()函数解压流。最后,我想以字符串或字节格式返回实际值 我知道gzip。NewReader需要io.Reader作为输入,但据我所知,typeReader实现接口io.Reader。我认为这不会导致任何错误,但我想知道在这种情况下可能会出现什么问题。如果你能帮我解决这个问题,我将不胜感激 如果你想知道这段文字是什么 “amZzRUR2NHVtc

我在解压缩以前压缩过的字节流时遇到了一个问题。基本上,我尝试使用函数
bytes.NewReader()
创建一个读卡器,然后使用
gzip.NewReader()
函数解压流。最后,我想以字符串或字节格式返回实际值

我知道
gzip。NewReader
需要
io.Reader
作为输入,但据我所知,type
Reader
实现接口
io.Reader
。我认为这不会导致任何错误,但我想知道在这种情况下可能会出现什么问题。如果你能帮我解决这个问题,我将不胜感激

如果你想知道这段文字是什么

“amZzRUR2NHVtcVpiZHNROHJiTTNYeGdUSndGTlVDZC9jaElSK1lXcFlJOD0=”

这是从我的客户端python脚本发送的示例输入。它使用gzip进行压缩,使用AES128进行加密,最后按照以下顺序在base64中编码

客户端代码:

import time
import json
import requests
import random
import gzip
import base64

from Crypto.Cipher import AES

baseurl = 'http://0.0.0.0:80'
key = 'TfvY7I358yospfWKcoviZizOShpm5hyH'
iv = 'mb13KcoviZizvYhp'

MODE = AES.MODE_CFB
BLOCK_SIZE = 16
SEGMENT_SIZE = 128

def http_post(url, data):
    print('Going to make a request to {} with the following data: {}'.format(url, data))
    r = requests.post(url,
                  data=data,
                  headers={'Content-type': 'application/json; charset=utf-8',
                           'Connection': 'keep-alive'}, )
    if r.status_code != 200:
        print('Server returned unexpected response code {}, and content: {}'.format(r.status_code, r.content))
        return False
    else:
        data = r.json()
        return data


def post_sample_data(key, iv):
    fake_device_id = "MB88"
    Load_VA_Total_Mean = random.randint(1000, 100000)
    print('Data that should come back: {}'.format(Load_VA_Total_Mean))
    data = {'i': fake_device_id, 'p': [
    {'d': [54.3, 0, 99, 49.35, 3, 99, 51.533, 1, 98, 28964, 7348, 43590, Load_VA_Total_Mean, 10350, 55200, 49.7],
     't': time.time(), 'dt': 'p'}]}
    url = baseurl + '/realtimedata'
    encryption_key_reference = 1
    payload = '{}\n{}'.format(convert_pack(data, key, iv), encryption_key_reference)
    return http_post(url, payload)


def convert_pack(inputdict, key, iv):
    jsonpayload = json.dumps(inputdict)  # encode dict to json string
    gzippayload = gzip.compress(jsonpayload.encode('utf-8'))  # compress with gzip
    encryptedpayload = base64.b64encode(encrypt(key, iv, message))
    encoded = base64.b64encode(encryptedpayload)
    print('encoded: {}'.format(encoded))

    return str(encoded, encoding='utf-8')


def _pad_string(value):
    length = len(value)
    pad_size = BLOCK_SIZE - (length % BLOCK_SIZE)
    return value.ljust(length + pad_size, '\x00')


def encrypt(key, iv, plaintext):
    aes = AES.new(key, MODE, iv, segment_size=SEGMENT_SIZE)
    plaintext = _pad_string(plaintext)
    encrypted_text = aes.encrypt(plaintext)
    return encrypted_text


post_sample_data(key, iv)
服务器代码:

package main

import (
"crypto/aes"
"crypto/cipher"
"crypto/rand"
"encoding/base64"
"fmt"
"io"
"compress/gzip"
"io/ioutil"
"bytes"
)

func main() {
    receivedText := "amZzRUR2NHVtcVpiZHNROHJiTTNYeGdUSndGTlVDZC9jaElSK1lXcFlJOD0="
    fmt.Println("encrypted + encoded + gzipped: ", originalText)
    key := []byte("TfvY7I358yospfWKcoviZizOShpm5hyH")

    text := decrypt(key, originalText)
    fmt.Println("decrypted: ", string(text))
    reader := bytes.NewReader(text)
    gzReader, err1 := gzip.NewReader(reader)
    fmt.Println(gzReader)

    if err1 != nil {
        fmt.Println("error1")
    }

    content, err2 := ioutil.ReadAll(gzReader)

    if err2 != nil {
        fmt.Println("error2")
    }

    fmt.Println(string(content))
}

func decrypt(key []byte, cryptoText string) []byte {
    ciphertext, _ := base64.StdEncoding.DecodeString(cryptoText)
    fmt.Println("decoded: ", string(ciphertext))
    block, err := aes.NewCipher(key)
    if err != nil {
        panic(err)
    }

    iv := []byte("mb13KcoviZizvYhp")
    stream := cipher.NewCFBDecrypter(block, iv)
    stream.XORKeyStream(ciphertext, ciphertext)

    return ciphertext
}
输出:

<nil>
error1
panic: runtime error: invalid memory address or nil pointer dereference [recovered]
    panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x288 pc=0x10a9167]

goroutine 1 [running]:
io/ioutil.readAll.func1(0xc420037dd0)
    /usr/local/go/src/io/ioutil/ioutil.go:30 +0x119
panic(0x10c4580, 0x1154d00)
    /usr/local/go/src/runtime/panic.go:489 +0x2cf
compress/gzip.(*Reader).Read(0x0, 0xc420092000, 0x200, 0x200, 0x1024ade, 0xc400000008, 0xc4200120c0)
    /usr/local/go/src/compress/gzip/gunzip.go:247 +0x37
bytes.(*Buffer).ReadFrom(0xc420037d28, 0x11451a0, 0x0, 0xc420092000, 0x0, 0x200)
    /usr/local/go/src/bytes/buffer.go:179 +0x160
io/ioutil.readAll(0x11451a0, 0x0, 0x200, 0x0, 0x0, 0x0, 0x0, 0x0)
    /usr/local/go/src/io/ioutil/ioutil.go:33 +0x150
io/ioutil.ReadAll(0x11451a0, 0x0, 0x1, 0x7, 0x0, 0x0, 0x20)
    /usr/local/go/src/io/ioutil/ioutil.go:42 +0x3e
main.main()
    /Users/bkaankuguoglu/Desktop/Go-dev/tool-backend/tester.go:43 
+0x404
exit status 2

错误1
死机:运行时错误:无效内存地址或零指针解引用[已恢复]
死机:运行时错误:无效内存地址或零指针取消引用
[信号SIGSEGV:分段冲突代码=0x1 addr=0x288 pc=0x10a9167]
goroutine 1[正在运行]:
io/ioutil.readAll.func1(0xc420037dd0)
/usr/local/go/src/io/ioutil/ioutil.go:30+0x119
死机(0x10c4580、0x1154d00)
/usr/local/go/src/runtime/panic.go:489+0x2cf
压缩/gzip。(*读取器)。读取(0x0、0xc420092000、0x200、0x200、0x1024ade、0xc400000008、0xc4200120c0)
/usr/local/go/src/compress/gzip/gunzip.go:247+0x37
字节。(*缓冲区)。读取自(0xc420037d28、0x11451a0、0x0、0xc420092000、0x0、0x200)
/usr/local/go/src/bytes/buffer.go:179+0x160
io/ioutil.readAll(0x11451a0、0x0、0x200、0x0、0x0、0x0、0x0、0x0、0x0)
/usr/local/go/src/io/ioutil/ioutil.go:33+0x150
io/ioutil.ReadAll(0x11451a0、0x0、0x1、0x7、0x0、0x0、0x20)
/usr/local/go/src/io/ioutil/ioutil.go:42+0x3e
main.main()
/Users/bkaankuguoglu/Desktop/Go-dev/tool-backend/tester.Go:43
+0x404
退出状态2
问题在于,您传递给gz.NewReader()的读取器生成的“内容”不是有效的gzip流(数据)。如果
gzip.NewReader()

如果将有效的gzip流传递给
gzip.NewReader()
,则返回的
gzReader
将不会是
nil
,解码将成功

例如,文本
“hello”
的gzip编码形式是:

[31 139 8 0 0 0 0 0 0 255 203 72 205 201 201 7 0 134 166 16 54 5 0 0 0]
将其用作输入:

data := []byte{31, 139, 8, 0, 0, 0, 0, 0, 0,
    255, 203, 72, 205, 201, 201, 7, 0, 134, 166, 16, 54, 5, 0, 0, 0}
reader := bytes.NewReader(data)
// The rest is unchanged
它工作正常,输出为(在上尝试):

和{[31139800002037220520172013013416545000]0-1}
&{[]0001-01-01 00:00:00+0000 UTC 255}0x10440260 0x10462000 0[31 139 8 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
你好

您显示它返回了一个错误(应该先检查),那么到底是什么问题?打印实际的错误消息,它会准确地告诉您失败的原因。“此处有一些文本”不是gzip的有效输入。@JimB我现在编辑了我的问题,谢谢你的反馈!@bkaankuguoglu如果你问的问题实际上包含了你想问的实际问题而不是其他问题,那将非常有帮助。事实上(在解决了使问题无法编译的问题之后),现在问题的答案是:您的输入不是有效的gzip。现在,您粘贴到注释中的字符串可能是有效的gzip字符串的编码(至少有标题)。如何将其输入到程序中?nil错误是一个令人费解的问题,您从
gzip获得了一个错误。NewReader
然后您继续尝试处理,这肯定不起作用。一旦出现错误,您应该打印实际的错误消息,然后停止尝试使用失败操作的结果。感谢您的回答!在我的专业版中gram,首先,我gzip输入字符串,然后使用aes256加密,最后在base64中编码文本。我检查了加密和编码日期的最后两个步骤,没有gzip步骤似乎可以正常工作。什么是有效的gzip流?类似这样?\x1f\x8b\x08\x00\xcd1ZY\x02\xff%\x8e\xb1…@bkaankuguoglu我不知道gzip规范的核心是,我不能仅仅从字节来区分。如果它是有效的,
gzip
包应该接受它。如果它不接受它,它很可能是无效的。在您的示例中,您应该颠倒步骤:先进行base64解码,然后进行aes256解码,然后将结果传递给gzip解码。我添加了完整版本的脚本.我正在按照你描述的顺序做这些步骤。
&{[31 139 8 0 0 0 0 0 0 255 203 72 205 201 201 7 0 134 166 16 54 5 0 0 0] 0 -1}
&{{ [] 0001-01-01 00:00:00 +0000 UTC  255} 0x10440260 0x10462000 0 0 [31 139 8 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] <nil> true}
hello