c++ - go 等价于 c 类型

标签 c++ go

go 中 unsigned charunsigned char* 的正确等价物是什么?还是我这样做是对的?


我有这个 C++ 类:

class ArcfourPRNG
{
public:
    ArcfourPRNG();
    void SetKey(unsigned char *pucKeyData, int iKeyLen);
    void Reset();
    unsigned char Rand();

private:
    bool m_bInit;
    unsigned char m_aucState0[256];
    unsigned char m_aucState[256];
    unsigned char m_ucI;
    unsigned char m_ucJ;
    unsigned char* m_pucState1;
    unsigned char* m_pucState2;
    unsigned char m_ucTemp;
};

我正在尝试重写它:

type ArcfourPRNG struct {
    m_bInit bool
    m_aucState0 [256]byte
    m_aucState [256]byte
    m_ucI, m_ucJ []byte
    *m_pucState1 []byte
    *m_pucState2 []byte
    m_ucTemp []byte
}

func (arc4 *ArcfourPRNG) SetKey(pucKeyData []byte, iKeyLen int) {
func (arc4 *ArcfourPRNG) Reset() {
func (arc4 *ArcfourPRNG) Rand() uint {

好吧,我几个小时前才开始使用 go。所以这仍然让我感到困惑。


一个函数

for(i=0; i<256; i++)
{
    m_pucState1 = m_aucState0 + i;
    m_ucJ += *m_pucState1 + *(pucKeyData+m_ucI);
    m_pucState2 = m_aucState0 + m_ucJ;
    //Swaping
    m_ucTemp = *m_pucState1;
    *m_pucState1 = *m_pucState2;
    *m_pucState2 = m_ucTemp;
    m_ucI = (m_ucI + 1) % iKeyLen;
}
memcpy(m_aucState, m_aucState0, 256); // copy(aucState[:], aucState0) ?

最佳答案

希望这可以为您解决一些问题。

  • 要存储原始字节序列,请使用 slice []byte。如果您确切知道序列的长度,则可以指定它,例如[256]byte 但您以后无法调整它的大小。
  • 虽然 Go 有指针,但它没有指针运算。因此,您将需要使用整数来索引您的 byte slice 。
  • 对于存储单个字节,byte 就足够了;你不想要一片字节。在 C++ 代码中有指向数组中特定位置的指针的地方,您将只拥有一个选择 slice 中一个元素的整数索引值。
  • Go 字符串不是简单的字节序列,它们是内部存储为 rune 的 UTF-8 字符序列,可能具有不同的长度。所以不要尝试将字符串用于此算法。

要重新实现所示算法,您根本不需要指针或指针运算。您将在 slice 中使用 int 索引,而不是像在 C++ 中那样将指针保存到字节数组中。

这有点难以理解,因为它实际上是所有 指针算法。我想在转换这个算法时方便地描述算法(因为这可能是一个众所周知的算法,应该不难找到)。我不会为您做整个 转换,但我会用一个更简单的例子来演示。这会将字符串的每个字符打印在单独的行上。

C++:

unsigned char *data = "Hello World";
unsigned char *ptr = 0;

for (int i = 0; i < std::strlen(data); i++) {
    ptr = i + data;
    std::cout << *ptr << std::endl;
}

开始:

data := []byte("Hello World")

for i := 0; i < len(data); i++ {
    // The pointer is redundant already
    fmt.Println(data[i:i+1])
}

所以,learn about Go slices ,当您重新实现此算法时,您可能会发现代码比对应的 C++ 代码更简单,或者至少更容易理解。

关于c++ - go 等价于 c 类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28548970/

相关文章:

c++ - 正确使用工厂类的标准 move

c++ - 检查共享行、列、对角线的最有效方法?

go - Android Things 是否支持 golang?

forms - 使用 http.Client 创建一个损坏的表单

go - 使用 goroutine 运行 cmd.Wait() 时的错误处理

c++ - 如何打印出文本文件的内容

c++ - =* 是什么意思? (Winsock-C++)

c++ - 转发声明 boost::signals2::signal<void()>

go - 静态检查 Nil 接口(interface)值?

go - 将文本文件读入字符串数组(并写入)