0

我有一个数字向量。vector<int> vec={16383 1 8192}. 我需要将它们转换为字节数组,以便 SPI 写入函数可以读取它并传输数据。但是,我无法使字节数组的向量起作用。我是 C++ 新手。

基本上,如果我的代码不清楚(可能是),我想从

std::vector <int> output={16383,1,8192};

std::vector <byte array> finalbuffer= {{0,63,255},{0,0,1},{0,32,0}};

所以我可以打电话finalbuffer[0],它会包含{0,63,255}.

我试过查找这个问题,但答案是浮动的,而不是我需要的。我尝试制作一个多维数组,但是我的初始向量大小并不总是相同的,并且取决于正在读入的数据。

std::vector <int> output={16383,1,8192};

//the basic code to convert from integer to byte array, I don't know how 
// to convert the int vector to a byte array vector 
uint8 tx_buffer1[3] = { 0,0,0 };
   for (unsigned i = 0; i < output.size(); ++i) {
         for (unsigned j = 0; j < 3; ++j) {
              tx_buffer1[j] = (output[i] >> (2 - j) * 8) & 0xFF;                     
              cout << unsigned(tx_buffer1[j]) << endl;               
              } 
}

//The above works such that
int output=16383;
uint8 tx_buffer1[3] = { 0,0,0 };
for (unsigned j = 0; j < 3; ++j) {
      tx_buffer1[j] = (output >> (2 - j) * 8) & 0xFF;                    
       cout << unsigned(tx_buffer1[j]) << endl;              
        }   
tx_buffer[0]=0
tx_buffer[1]=63
tx_buffer[2]=255
// But I need it for multiple integers from the vector.

以下适用于uint8 finalbuffer= {0-255,0-255,0-255}. handle&transfercount并且options不重要。3 表示它读取字节,我需要它以便它将读取每个元素中带有字节数组的向量

std::vector <byte array> finalbuffer= {{0,63,255},{0,0,1},{0,32,0}};

//finalbuffer[0] would contain {0,63,255}

//finalbuffer[1] would contain {0,0,1}

//...

for {unsigned i=0; i<finalbuffer.size(); ++i) {
status = SPI_Write(handle, finalbuffer[i], 3, &transferCount, options);
            if (status != FT_OK)
                print_and_quit("Error while transmitting bytes.");
}

我无法让我的代码工作。不是字节数组向量的更好方法是什么?

4

1 回答 1

0

嗯,我有点理解,但不完全。因此,也许我的回答并不准确。

但首先,您想将带有整数的向量转换为具有 3 个字节的向量。

对于 3 个字节的东西,我们将使用大小为 3 的 std::array 字节。我们将对所有内容使用无符号数。

然后我们创建这个数组的向量。

整个无符号整数向量可以在一个转换语句中转换为字节数组向量。那很容易。我们也可以将它复制到一个普通的旧 C 样式数组中。

但这不是必需的。您可以使用 的数据功能std::array来访问基础数据。

这是转换代码

#include <vector>
#include <array>
#include <cstdint>
#include <algorithm>
#include <iterator>
#include <iostream>

using Byte = uint8_t;
using B3Array = std::array<Byte, 3>;

std::vector <unsigned int> output = { 16383,1,8192 };
std::vector<B3Array> finalbuffer{};
Byte plainCStyleArray[3];

int main()
{
    // Convert to byte array, C++ style
    std::transform( output.begin(), output.end(),std::back_inserter(finalbuffer),
        [](const unsigned int i) {
            Byte b0 = (i >> 16) & 0xFF; Byte b1 = (i >> 8) & 0xFF; Byte b2 = (i)  & 0xFF;
            B3Array ba{ b0,b1,b2 };
            return ba;
        }
    );

    // Copy one vector to plain C-Style array (but why?)
    std::copy_n(finalbuffer[0].begin(), 3, plainCStyleArray);

    // Play a little bit. Some test code
    for (size_t i = 0; i < output.size(); ++i) {
        B3Array b3a = finalbuffer[i];
        std::copy_n(b3a.begin(), 3, std::ostream_iterator<int>(std::cout, " "));
        std::cout << '\n';
    }
    return 0;
}

然后你可以在你的函数中写(在 之后std::transform):

for {unsigned i=0; i<finalbuffer.size(); ++i) {
status = SPI_Write(handle, finalbuffer[i].data(), 3, &transferCount, options);
            if (status != FT_OK)
                print_and_quit("Error while transmitting bytes.");
}

如您所见,我刚刚添加.data()finalbuffer[i]

这一切似乎如此简单,以至于我想,我可能误解了你的问题。对不起。. .

于 2019-07-17T21:52:25.947 回答