C 如何将字节数组转换为整数数组?

C 如何将字节数组转换为整数数组?,c,microcontroller,C,Microcontroller,我使用的是dsPic33F(16位微控制器) 如何将代码> char []/COD>转换为 INT[] /COD>,使每两个字符都成为C++的int() 逆运算呢 我想你想把字节包合并成int 您需要做的是在创建int时移位位 (oki这是java,因为这里没有我的C++代码) public静态final int byteArrayToInt(字节[]b){ 返回(b[0]24), (字节)(值>>>16), (字节)(值>>>8), (字节)值}; } 只要您知道变量的长度,此逻辑就可以用

我使用的是dsPic33F(16位微控制器)

    如何将代码> char []/COD>转换为<代码> INT[] /COD>,使每两个字符都成为C++的int()
  • 逆运算呢

我想你想把字节包合并成int

您需要做的是在创建int时移位位

(oki这是java,因为这里没有我的C++代码)

public静态final int byteArrayToInt(字节[]b){
返回(b[0]24),
(字节)(值>>>16),
(字节)(值>>>8),
(字节)值};
}

只要您知道变量的长度,此逻辑就可以用于任何转换格式。我假设您的字符数组包含字节(而不是实际的ascii字符),您希望将其转换为16位有符号整数。下面的函数将用于MSB第一字节排序。我在这里使用了无符号字符来表示字节输入(uint8\u t)


无效字节点(uint8字节字节数组、uint16字节数组、uint16字节数组、uint16字节数组){


在dSPIC33 f上,我怀疑你使用C++。如果你使用C++,你使用什么编译器,你有多少运行库?(你在哪里得到的?) 如果字节顺序正确,如果需要副本,您可以使用memcpy(),如果您只想使用缓冲区中的16位数字,并且对齐正常,则可以使用指针。如果您正在管理缓冲区,在这样的平台上使用union来满足这类需求并不罕见:


typedef unsigned short uint16_t;
typedef signed short int16_t;
typedef unsigned char uint8_t;
union my_buffer {
    unsigned char char_buf[128];
    int int_buf[64];
};
void doit(int16_t* dest, char const* src, size_t word_count)
{
    char* const end = (char*) (dest + word_count);
    char* p;

    for (p = (char*) dest; p != end; src += 2, p += 2) {
        p[0] = src[1];
        p[1] = src[0];
    }
}
处理字符时通过char_buf访问,处理int时通过int_buf访问

如果需要交换字节,只需实现swab()的一个变体,并使用它而不是memcpy(),类似于其他答案,或类似以下代码:


typedef unsigned short uint16_t;
typedef signed short int16_t;
typedef unsigned char uint8_t;
union my_buffer {
    unsigned char char_buf[128];
    int int_buf[64];
};
void doit(int16_t* dest, char const* src, size_t word_count)
{
    char* const end = (char*) (dest + word_count);
    char* p;

    for (p = (char*) dest; p != end; src += 2, p += 2) {
        p[0] = src[1];
        p[1] = src[0];
    }
}

以下是一个经过编译和测试的方法:

#include <stdio.h>

unsigned short ByteToIntArray( 
        unsigned char inByteArray[], 
        unsigned short inArraySize, 
        unsigned short outWordArray[], 
        unsigned short outArraySize, 
        unsigned char swapEndian
    )
{
    if (    ( inArraySize/2 > outArraySize )
         || ( outArraySize == 0 ) 
         || ( inArraySize == 0 )
       )
    {
        return -1;        
    }

    unsigned short i;

    if ( swapEndian == 0 )
    {    
        for ( i = 0; i < outArraySize; ++i )
        {
            outWordArray[ i ] = ( (unsigned short)inByteArray[ i*2 ] << 8 ) + inByteArray[ i*2 + 1 ];
        }
    }
    else
    {
        for ( i = 0; i < outArraySize; ++i )
        {
            outWordArray[ i ] = ( (unsigned short)inByteArray[ i*2 + 1 ] << 8 ) + inByteArray[ i*2 ];
        }
    }
    return i;    
}


int main(){
    unsigned char ucArray[ 16 ] = { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF };
    unsigned short usArray[ 8 ];
    unsigned short size;

     // "/ 2" on the usArray because the sizes are the same in memory
     size = ByteToIntArray( ucArray, sizeof( ucArray ), usArray, sizeof( usArray ) / 2, 0 );

    if( size > 0 )
    {
        printf( "Without Endian Swapping:\n" );
        for( unsigned char i = 0; i < size ; ++i )
        {
            printf( "0x%04X ", usArray[ i ] );
        }
        printf( "\n" );
    }

    if( size > 0 )
    {
         // "/ 2" on the usArray because the sizes are the same in memory
        size = ByteToIntArray( ucArray, sizeof( ucArray ), usArray, sizeof( usArray ) / 2, 1 );

        printf( "With Endian Swapping:\n" );
        for( unsigned char i = 0; i < size ; ++i )
        {
            printf( "0x%04X ", usArray[ i ] );
        }
        printf( "\n" );
    }
    return 0;
}
#包括
无符号短字节点数组(
无符号字符字节数组[],
未签名的短尺寸,
无符号短外向数组[],
未签名的短消息未排列,
无符号字符交换
)
{
如果((inaraysize/2>outArraySize)
||(outArraySize==0)
||(inaraysize==0)
)
{
返回-1;
}
无符号短i;
如果(swapEndian==0)
{    
对于(i=0;i
BytePointArray接受5个参数并返回实际转换的数组的大小,如果传入的OutordArray大于实际转换的大小,同时作为一种获取错误的方法,这将非常方便

简单的按位移位运算符和+用于将两个字节组合成一个字

我只是使用printf来测试程序,我知道在嵌入式硬件中使用它通常需要分配代码空间。我只是包括了Endian交换,以确保您可以看到在这两种情况下需要做什么,但在实际实现中可以很容易地删除它


BytePointArray例程中还有很多优化空间,但这种方式很容易理解。

我不确定您的字节是指字符还是八位字节。在dsPIC的16位字中,您可能已经有两个八位字节,因此您没有更多的空间来打包它们

#include <limits.h>
#include <stddef.h>

#define BYTE_BIT CHAR_BIT /* Number of significant bits in your 'byte' * Read note below */

/* pack routine */
void ipackc(int *packed, const char *unpacked, size_t nints) {
    for(; nints>0; nints--, packed++, unpacked += 2) {
        *packed = (unpacked[0]<<BYTE_BIT) | (unpacked[1] & ((1<<BYTE_BIT)-1));
    }
}

/* unpack routine */
void cunpacki(char *unpacked, const int *packed, size_t nints) {
    for(; nints>0; nints--, packed++, unpacked += 2) {
        unpacked[0] = *packed>>BYTE_BIT;
        unpacked[1] = *packed & ((1<<BYTE_BIT)-1);
    }
}

您想简单地更改每个元素的类型而不修改任何值(即,对于每个
i
byteArray[i]==intArray[i]
),还是需要将
byte
数组重新解释为
int
数组(例如,4个连续的
byte
元素)→ 1
int
元素)?我想你的意思是硅片中的
int
char
?。每对字节都将转换为一个int。你需要大的还是小的Endian?@Jader,如果你想为它编码,我建议研究这个MCU的编程模型。这有助于你理解如何完成这些任务。而且,dsPIC33F是小的Endian(低位字节位于低位地址)。但如果您不必对组合整数进行算术计算,那也没关系。您需要首先澄清问题。N字节->N整数?如果不是这样,这将失败。指针算术也比索引更好。他说字节[]到整数[],所以我假设是1:1对应关系(否则它只是一个强制转换)。是的,我可能会使用指针算法或std::copy,但如果有人不知道如何复制数组,我不想混淆操作。如果我需要每2个字节获取一个int,该怎么办?如果
sizeof(int)==2
,那么
int*intArray=(int*)byteArray;
会这样做。永远不要使用
new[]
。使用
std::vector
。没有损失,只有收益。@user440336我理解你的解决方案。我必须将其调整为16位整数去掉24位,然后^^^如果你得到逻辑,那么你可以使用此代码从任何格式转换为任何格式。很高兴它有帮助。注意,作者谈到DSP,它通常可以有任意位数在char(可能是16)中,所以您应该小心:使用char_位宏而不是8,测试int是否足以存储两个字符(2+1@Vovanium),他再次说:“如何将char[]转换为int[],以便使用C++将每两个字符转换为int.”两个字符能装进一个盒子int@vovanium:dspic 33F每个字节有八位。@janm,我从来没有说过dspic的字符不是8位(但也没有说它是8位)。请仔细阅读。错误。这在您的电脑上有效,但在dspic上无效。请注意
#include <limits.h>
#include <stddef.h>

#define BYTE_BIT CHAR_BIT /* Number of significant bits in your 'byte' * Read note below */

/* pack routine */
void ipackc(int *packed, const char *unpacked, size_t nints) {
    for(; nints>0; nints--, packed++, unpacked += 2) {
        *packed = (unpacked[0]<<BYTE_BIT) | (unpacked[1] & ((1<<BYTE_BIT)-1));
    }
}

/* unpack routine */
void cunpacki(char *unpacked, const int *packed, size_t nints) {
    for(; nints>0; nints--, packed++, unpacked += 2) {
        unpacked[0] = *packed>>BYTE_BIT;
        unpacked[1] = *packed & ((1<<BYTE_BIT)-1);
    }
}
((1<<BYTE_BIT)-1)
    /--N--\
...011...11 (binary)