C 如何将字节数组转换为整数数组?
我使用的是dsPic33F(16位微控制器)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), (字节)值}; } 只要您知道变量的长度,此逻辑就可以用
- 逆运算呢
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
元素)→ 1int
元素)?我想你的意思是硅片中的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)