RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 809030
Accepted
Pavel Perevezencev
Pavel Perevezencev
Asked:2020-04-04 01:10:22 +0000 UTC2020-04-04 01:10:22 +0000 UTC 2020-04-04 01:10:22 +0000 UTC

覆盖 io.Reader 接口方法

  • 772

需要加密 tcp 连接。我正在尝试覆盖 conn net.Conn 对象的 Read 方法

type Stream struct {
    conn net.Conn
    alg  algorithms.CipherAlgorithm
}

func (s *Stream) Read(p []byte) (n int, err error) {
    var buf bytes.Buffer
    len, err := buf.ReadFrom(s.conn)
    if err != nil {
        return 0, err
    }
    p, err = s.alg.Decrypt(buf.Bytes())
    if err != nil {
        return 0, err
    }
    return int(len), err
}

func (s *Stream) Write(p []byte) (n int, err error) {
    ciphertext, err := s.alg.Encrypt(p)
    if err != nil {
        return 0, err
    }
    return s.conn.Write(ciphertext)
}

当我尝试从套接字读取消息并解码 json

encriptedConnection := encription.NewStream(conn, &algorithms.DES{symmetricKey})
var credentials struct{ Login, Password string }
err = json.NewDecoder(encriptedConnection).Decode(&credentials)
if err != nil {
  log.Println(err.Error())
}

我收到这样的错误

2018/04/03 19:59:17 invalid character '\x00' looking for beginning of value

问题是如何更改从 tcp 套接字读取的内容?

golang
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    rekby
    2020-04-04T16:42:08Z2020-04-04T16:42:08Z

    你在这里有两个问题:

    1 无论传入介质 p 的容量如何,都从连接中减去所有可用数据。如果您有编码和解码的数据,允许您逐字节解码,而不改变长度,您需要做这样的事情

    var buf = make([]byte, len(p))
    len, err = conn.Read(buf)
    

    如果上游读取器通过一个小缓冲区,则只读取所需数量的数据并且不会丢失它们的尾部。

    每行 2 个

    p, err = s.alg.Decrypt(buf.Bytes())
    

    []byte 不是数组,而是数据结构:指向数组的指针,长度,容量。

    在这一行中,不是将数据写入原始切片,将原始数组写入 p,而是为 p 分配一个指向新数组的新结构,但是由于 p 是通过副本传递的(在 go 中,所有参数都是通过副本传递的)按值,包括指针 - 它们也被复制)。调用函数对新数组一无所知。在这里,您需要执行以下操作:

    p2, err := s.alg.Decrypt(buf.Bytes())
    copy(p, p2)
    

    好吧,或者 Decrypt 对读者做类似的事情——让他立即将数据写入所需的切片。

    • 2

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    是否可以在 C++ 中继承类 <---> 结构?

    • 2 个回答
  • Marko Smith

    这种神经网络架构适合文本分类吗?

    • 1 个回答
  • Marko Smith

    为什么分配的工作方式不同?

    • 3 个回答
  • Marko Smith

    控制台中的光标坐标

    • 1 个回答
  • Marko Smith

    如何在 C++ 中删除类的实例?

    • 4 个回答
  • Marko Smith

    点是否属于线段的问题

    • 2 个回答
  • Marko Smith

    json结构错误

    • 1 个回答
  • Marko Smith

    ServiceWorker 中的“获取”事件

    • 1 个回答
  • Marko Smith

    c ++控制台应用程序exe文件[重复]

    • 1 个回答
  • Marko Smith

    按多列从sql表中选择

    • 1 个回答
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Suvitruf - Andrei Apanasik 什么是空? 2020-08-21 01:48:09 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5