【问题标题】:How to modify an array?如何修改数组?
【发布时间】:2012-11-30 02:37:18
【问题描述】:

我目前正在尝试使用一些 .wav 文件进行隐写术。

我想做的是编写一个程序,将声音文件打开到一个数组中,然后修改该数组,但这就是我卡住的地方。

目前我有:

#include <stdio.h>
#include "scc110wav.h"

int main ()
{
    unsigned char *soundData = LoadWavAudioFile("3stepoct.wav");

    int byte;

    for (byte = 0; byte <= 5554944; byte++){
        printf("%d\n", soundData[byte]);
    }
}

我目前所能做的就是打印数组,但无法更改数组的值。我知道我不需要在最后打印数组,特别是因为它太大了,但我只是想感受一下文件,这样我就可以将数组值更改为 ASCII 值,而无需监听检测到声音的大部分变化。

【问题讨论】:

  • 好吧,soundData[index] = 42; 还不够好吗?
  • 我喜欢“int byte;”这就像“长字符串;”
  • 我很困惑,到底是什么问题?你有什么理由不能只用soundData[byte] = 50; 或一些无符号字符值写信给它吗?

标签: c arrays steganography


【解决方案1】:

soundData 不是const,因此您可以使用[] 运算符访问流的字节并对这些数据做任何您想做的事情。

【讨论】:

    【解决方案2】:

    根据我的理解,您对需要更改的地方感到困惑,以便 wav 文件可以播放。 如果这是问题,您可以从下面的链接了解有关波形文件格式的所有信息

    Click here to learn Wave file format

    您可以通过保留有关块大小等的其他详细信息来更改数据部分。

    【讨论】:

      【解决方案3】:

      当您使用%d 说明符在for 循环中打印soundData[byte] 时,您正在打印存储在soundData[byte] 中的字符的ASCII 值。因此,您可以轻松访问和修改存储的数据在soundData[byte] 中的任何时间点,就像您使用普通数组一样。除了它只是unsigned char *,所以没有什么能阻止您修改数组中的任何内容。

      您可能需要考虑将byte 的数据类型从int 更改为long long,因为for 循环中使用的5554944 超出了int 最大存储值限制。所以,基本上你会翻来覆去。

      一旦您了解了如何访问音频文件中的数据,您真正应该了解的是一种可以在输入流上实现的良好隐写算法。最简单的一种是基于 LSB 的算法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-11-13
        • 1970-01-01
        • 1970-01-01
        • 2011-05-07
        • 2019-09-23
        • 2015-05-18
        • 1970-01-01
        • 2018-07-25
        相关资源
        最近更新 更多