1

UCHAR2つの(8ビット)配列をCの(16ビット)値に結合する必要がありUSHORTます。ただし、「for」やループを使用せずに結合する必要があります。

なので:

UCHAR A[1000], B[1000];
USHORT C[1000];

結果は次のようになります。

C[0] = {A[0], B[0]};
C[1] = {A[1], B[1]};
...
C[1000]={A[1000], B[1000]};
4

3 に答える 3

6
uint8_t one = 0xBA;
uint8_t two = 0xBE;

uint16_t both = one << 8 | two;

更新: 多分私はあなたの問題を理解していません...しかしあなたがuint8_t配列をuint16_t配列に変換したいなら->サイズをチェックしてキャストしてください

uint8_t array[100];
uint16_t array_ptr_ushort* =(uint16_t*)&array[0];

配列のサイズが均一であることを確認してください。

UPDATE2:

uint8_t array1[100];
uint8_t array2[100];
uint16_t combined[100];

memcpy(combined, array1, sizeof(array1))
memcpy((uint8_t*)combined + sizeof(array1), array2, sizeof(array2))

UPDATE3:

ある種のループがなければ、2つのアレイを1つの連続したアレイに結合することはできません。このためにDMAを使用しても、ループは基盤となるハードウェアに存在します...

UPDATE4:

再帰的に行うことができます。

#include "stdafx.h"
#include <cstdint>
#include <algorithm>

uint8_t arrayA[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
uint8_t arrayB[] = {0xA, 0x9, 0x8, 0x7, 0x6, 0x5, 0x4, 0x3, 0x2, 0x1};
uint16_t array_combined[sizeof(arrayA)] = {};
static_assert(sizeof(arrayA) == sizeof(arrayB), "Arrays of different sizes");

uint16_t combine(const uint8_t *a, const uint8_t *b, uint16_t *put, uint32_t size)
{
    uint16_t value = (*a << 8) | *b;
    if(size)
        *put = combine(++a, ++b, ++put, --size);
    return value;
}

void combine_arrays(const uint8_t *a, const uint8_t *b, uint16_t *put, uint32_t size)
{
    *put = combine(a, b, put, size);
}

int _tmain(int argc, _TCHAR* argv[])
{

    combine_arrays(arrayA, arrayB, array_combined, sizeof(arrayA));

return 0;
}

UPDATE5: C++のstatic_assertを使用したCバージョン

#include <stdint.h>


uint8_t array1[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
uint8_t array2[] = {0xA, 0x9, 0x8, 0x7, 0x6, 0x5, 0x4, 0x3, 0x2, 0x1};
uint16_t array_combined[sizeof(array1)] = {};
static_assert(sizeof(array1) == sizeof(array2), "Arrays of different sizes");

int _tmain(int argc, _TCHAR* argv[])
{

    int size = sizeof(array1);
    int count = 0;
    do
    {
        array_combined[count] = (array2[count] << 8) | array1[count];
    }while(count++ != size);

    return 0;
}

UPDATE6:これを実現するC++の方法もあります...

于 2013-02-19T13:13:22.687 に答える
2

単一要素の場合、最初のバイトをビット単位で8ビット左にシフトし、ビット単位または:を使用して2番目のバイトを追加できます。

C[i] = (A[i] << 8) | B[i];

ただし、配列の場合、基本的に2つの配列を次のように3番目の配列に「分散」させます。

A[0] B[0]  |  A[1] B[1]  |  A[2] B[2]  |  ...  |  A[n-1] B[n-1]

   C[0]    |     C[1]    |     C[2]    |  ...  |     C[n-1]    

つまり、配列の最初の要素がCアドレスに格納されている場合、配列の0要素はAアドレス0、16、32、48 ...にあり、配列の要素はBアドレス8、24、...にある必要があります。 IMHOはループを使用せずに実行することはできません

于 2013-02-19T13:14:08.443 に答える
2
ushortVal = ( ucharVal[0] << 8 ) | ucharVal[1];
于 2013-02-19T13:13:39.790 に答える