【问题标题】:How to copy uint8* to vector<Uint8> correctly如何将 uint8* 正确复制到 vector<Uint8>
【发布时间】:2016-09-23 21:36:33
【问题描述】:

我正在尝试从 Uint8* 制作一个 Uint8 向量,但由于某些原因有些值不一样。这是我的代码。

std::vector<Uint8> wav_vector = {}; 
Uint8* wav_buffer_;   
for (unsigned int i = 0; i < wav_length_; i++) {
  wav_vector.push_back(wav_buffer_[i]);
}

然后我尝试验证这些值:

for (unsigned int i = 0; i < wav_length_; i++){
    if (wav_buffer_[i]!=wav_vector[i]){
      cout<<i<<endl;
      printf("Orignal Buffer %u\n", wav_buffer_[i]);
      printf("Vector Buffer %u\n", wav_vector[i]);

    }
  }

这些是我的示例输出:

Index: 0
Orignal Buffer 208
Vector Buffer 40

Index: 1
Orignal Buffer 72
Vector Buffer 3

Index: 2
Orignal Buffer 111
Vector Buffer 183

Index: 3
Orignal Buffer 1
Vector Buffer 97

Index: 4
Orignal Buffer 0
Vector Buffer 79

Index: 5
Orignal Buffer 0
Vector Buffer 127

Index: 8
Orignal Buffer 120
Vector Buffer 40

Index: 9
Orignal Buffer 251
Vector Buffer 3

Index: 10
Orignal Buffer 182
Vector Buffer 183

Index: 16
Orignal Buffer 0
Vector Buffer 176

Index: 17
Orignal Buffer 0
Vector Buffer 200

Index: 18
Orignal Buffer 0
Vector Buffer 109

Index: 19
Orignal Buffer 0
Vector Buffer 1

Index: 24
Orignal Buffer 0
Vector Buffer 176

Index: 25
Orignal Buffer 0
Vector Buffer 200

Index: 26
Orignal Buffer 0
Vector Buffer 109

Index: 27
Orignal Buffer 0
Vector Buffer 1

Index: 32768
Orignal Buffer 16
Vector Buffer 120

任何帮助将不胜感激。

注意: 我试过这个并且它有效。但我想使用 for 循环,因为我有一些其他需要位移的音频格式。

std::vector<Uint8> wav_vector(&wav_buffer_[0], &wav_buffer_[wav_length_]);

【问题讨论】:

  • 您的wav_buffer_ 指针已正确初始化还是只是指向某个地方?
  • 旁注:从数组初始化vector 不需要显式循环:std::vector&lt;Uint8&gt; wav_vector(wav_buffer_, wav_buffer_+wav_length_); 完成。
  • 它指向构造函数中的某个地方。 Uint8* wav_buffer_; AudioFile::AudioFile(SDL_AudioSpec* wav_file, Uint8* wav_buffer, Uint32 wav_length) : wav_file_(wav_file), wav_buffer_(wav_buffer), wav_length_(wav_length){ //SDL_FreeWAV(wav_buffer); }
  • 如果在执行复制的循环期间打印数组元素,您会看到什么?
  • 循环没有理由不工作。如果将cout &lt;&lt; wav_buffer_[i]; 放入复制循环中,您会看到什么?您看到的值是否与您在打印数组和向量之间差异的循环中看到的值相同?

标签: c++ sdl wav uint8t uint


【解决方案1】:

看起来std::vector 有一个可以从迭代器(或指针)复制的构造函数。

你可以这样做:

std::vector<uint8_t> my_vector(&wave_buffer[0], &wave_buffer[N]);

【讨论】:

  • 谢谢,这行得通,但我想尝试使用 for 循环,因为我有一些其他音频格式,例如 16 位、32 位、有符号 16 位、有符号 8 位、无符号 16 位、无符号8位(当前代码是它)。其中一些需要位移才能将所有内容转换为 uint8_t,因为 wav_buffer_ 在 for 循环中属于 Uint8 类型,我现在还不能完全确定。
【解决方案2】:

也许你可以试试memcpy:

#include <iostream>
#include <vector>

int main()
{
    uint8_t arr[3] = {1, 2, 3};
    std::vector<uint8_t> vec(3);
    memcpy(vec.data(), arr, 3);
    for (auto i : vec)
        std::cout << static_cast<int>(i) << " ";
    std::cout << std::endl;
}

关于将数组复制到向量的更多详细信息可以找到:https://www.techiedelight.com/convert-array-vector-cpp/

希望对您有所帮助。

【讨论】:

    猜你喜欢
    • 2020-08-14
    • 1970-01-01
    • 2021-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-28
    • 2017-03-11
    • 1970-01-01
    相关资源
    最近更新 更多