如何将1字节数据转换为2字节数据

问题描述 投票:0回答:4

我想将1字节的数组元素转换为2字节 例如

arr[size] = {0x1F};

所以,我希望 0x1F 将存储在 第二个数组就像,

arr_2[size] = {0x01, 0x0f}

我尝试过以下方式...

for(i=j=0; j<2; i++){

arr_2[j]  =(0xF0 & arr[i]) >> 4;
arr_2[j++]=(0x0F & arr[i]);

}

提前致谢..!!

arrays c bit-manipulation bit-shift bitwise-and
4个回答
1
投票

事实上,除了 for 循环语句之外,你所做的一切都是正确的

for(i=j=0; j<2; i++){

arr_2[j]  =(0xF0 & arr[i]) >> 4;
arr_2[j++]=(0x0F & arr[i]);

}

在其主体中至少设置数组的相同元素

arr_2
两次。

这是多余的。

你可以直接写

arr_2[0]  =(0xF0 & arr[0]) >> 4;
arr_2[1] = 0x0F & arr[0];

1
投票

为了构建 Vlad 的答案,也许您使用了循环,因为您确实想将 n 字节扩展为 n*2 字节。

for ( size_t i = 0; i < n; ++i ) {
   dst[ i*2+0 ] = ( src[ i ] >> 4 ) & 0xF;
   dst[ i*2+1 ] = ( src[ i ] >> 0 ) & 0xF;
}

for ( size_t j = 0, i = 0; i < n; ++i ) {
   dst[ j++ ] = ( src[ i ] >> 4 ) & 0xF;
   dst[ j++ ] = ( src[ i ] >> 0 ) & 0xF;
}

0
投票

您已经差不多完成了,但没有使用正确的 for() 语法来递增多个迭代器。

示例:

#define SIZE 1                      // for example, but the same principles 
                                    // would apply for malloc'd arrays
unsigned char arr[SIZE] = {0x1F};   // 'SIZE' bytes
unsigned char arr_2[SIZE * 2];      // You'll end up with twice as many bytes.


// ...
int i, j;

// note how we test the input iterator (i) against the input size and how
// the output iterator (j) is incremented by 2 on each iteration

for (i = 0, j = 0; i < SIZE; i++, j += 2)
{
    arr_2[j]     = (arr[i] & 0xF0) >> 4;
    arr_2[j + 1] = arr[i] & 0x0F;
}

0
投票

您不需要维护两个索引变量。这是一个解决方案,假设您想要将元素存储在源数组长度两倍的数组中:

#include <stdio.h>

#define LEN(arr) (sizeof (arr) / sizeof (arr)[0])

int main(void)
{
    unsigned char arr[] = {0x1f, 0x2f, 0x3f, 0x4f};
    unsigned char arr_2[2 * LEN(arr)];
    size_t i;

    for (i = 0; i < LEN(arr); i++) {
        arr_2[2 * i] = arr[i] >> 4;
        arr_2[2 * i + 1] = arr[i] & 0x0f;
    }
    for (i = 0; i < LEN(arr_2); i++) {
        printf("%x", arr_2[i]);
    }
    printf("\n");
    return 0;
}

输出:

1f2f3f4f
© www.soinside.com 2019 - 2024. All rights reserved.