【问题标题】:padding in vector with zeros用零填充向量
【发布时间】:2020-07-07 02:09:51
【问题描述】:

我的明文首先被转换为二进制文本,然后它应该被分成 64 位块,密钥必须单独加密这些块。例如,如果我的文本有 90 位,它应该用零补充,这样它就有 128 位。我不知道该怎么做。这是我的代码:

string ifile = "filetxt.txt";
string ofile = "file2.txt";
string key = "keywordd";
vector<int> k;
vector<int> txt;
char text;
vector<int> o;
int i;
int c = 0;
int d = 1;

void f() {
    ifstream ist ("filetxt.txt");
    ofstream ost ("file2.txt");
    int a[64], i;
    while (ist >> text) {
        for(char& text : key) {
            for(i=0; i < 8; i++){
                a[i] = text%2;
                text = text/2;
            }
            for(i=i-1; i >= 0 ;i--){
                k.push_back(a[i]);
            }
        }
        if (ist) {
            for(i=0; i < 8; i++){
                a[i] = text%2;
                text = text/2;
            }
            for(i=i-1 ;i >= 0 ;i--){
                txt.push_back(a[i]);
            }
            for(int j = 0; j < 8; j++) {
                if(k[j] == txt[j]) {
                    o.push_back(c);
                } else if (k[j] != txt[j]) {
                    o.push_back(d);
                }
            }
            for(i=0; i<8; i++) {
                ost << o[i];
            }
            for(i=0; i<8; i++) {
                cout << o[i];
            }
        }
    }
    cout << endl;
    for(i=0; i<64; i++) {
        cout << k[i];
    }
    cout << endl;
    for(i=0; i<64; i++) {
        cout << txt[i];
    }
}
int main()
{
    f();
    return 0;
}

我打算这样做:

if (txt.size()< 64){
    for(i= 0; i< 64- txt.size();i++){
        txt.push_back(c);
    }
}

我认为问题出在 txt 向量中,因为如果我想打印它,我

【问题讨论】:

  • 您的示例代码不是您想要的...它只会将txt 增加到 64 位...您似乎想要与 64 位块对齐...但它似乎也您将每个位存储在int 中。那是相当低效的。
  • 你知道我该如何解决这个问题吗?

标签: c++ vector padding


【解决方案1】:

很简单:

if (txt.size()< 64)
    txt.resize(64);

这将简单地用 int 的默认值填充向量,即 0。

如果您想要 0 以外的值(c 如您的代码所示),那么它是:

if (txt.size()< 64)
    txt.resize(64, c);

【讨论】:

  • 只修复了她的代码......这是不完整的。她要求 64 的倍数。
【解决方案2】:

你想要的是std::vector::resize。默认情况下,它将向量的大小增加到请求的大小(如果向量小于所述大小),并且添加的任何元素都将被初始化,这对于int 意味着零初始化。这给了你

if (txt.size() % 64 != 0)
    txt.resize(txt.size() + (64 - (txt.size() % 64)));

另请注意,64 个int不是 64 位的。 int 的大小必须至少为 16 位,这意味着其中 64 个将至少为 512 位。如果你真的需要 64 位块,你应该使用 std::uint64_t 作为位块(或类似的东西)

【讨论】:

  • 这是我的 filetxt alamakota,这是我的输出 000010100000101000001010000010100000101000001010000010100000101000001010,那是 72 个字符,我希望它是 128。打印矢量后,我看到添加了零,你知道哪里可能是加密的 outpatch 中的错误。
  • @sonia 我更新了 if 语句以将向量增加到下一个 64 的倍数。这应该可以满足您的需求。
  • 恕我直言,您的更新似乎不正确。它应该类似于64*(txt.size()/64+1)
  • @JHBonarius 是的,这是错误的。我已经用工作版本更新了它。
  • 它没有任何区别。输出是一样的
【解决方案3】:

在最后一步执行以下操作:

if ((txt.size() % 64) != 0){
    for(i= 0; i< 64-((txt.size() % 64)); i++){
        txt.push_back(c);
    }
}

这样,无论您的明文长度是多少,您的txt 向量将始终以长度为 64 的倍数结尾,必要时用零 (c) 填充。

【讨论】:

  • @JHBonarius 更不用说它是卑鄙的人为代码...... :-) 我需要一段时间,直到我明白i &lt; (txt.size() % 64) 的条件是正确的。咳咳……只要txt.size() % 64 也可以完成(并使if 过时以及i 的任何计数)。
  • 实际上我必须通过以下方式修复循环: for(i= 0; i
  • @JHBonarius 为什么你认为这种方法性能不好?
  • @Scheff 我不明白你的意思,为什么条件会过时?
  • 您是否注意到,每当您向txt 推送内容时,txt.size() 就会增加 1?因此,itxt.size()(和txt.size() % 64)以相等的距离运行,直到txt.size() % 64 为0。然后,i 大于txt.size() % 64 并且循环结束。这就是它真正起作用的原因。如果您使用过n = txt.size() % 64i &lt; n,则不会,因为n = 64 - txt.size() % 64 提供了正确数量的填充元素。
猜你喜欢
  • 2012-08-07
  • 2012-10-31
  • 2020-01-26
  • 2014-12-10
  • 2013-12-13
  • 1970-01-01
  • 2022-07-22
  • 2018-10-01
  • 2016-03-12
相关资源
最近更新 更多