Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将十六进制数组(char*)转换为整数_C_Int_Endianness_Binary Data - Fatal编程技术网

将十六进制数组(char*)转换为整数

将十六进制数组(char*)转换为整数,c,int,endianness,binary-data,C,Int,Endianness,Binary Data,我需要在C中将字节转换为int(或uint8/16/32)。 下面是对我的代码的解释: char* out; //init //out=read_udp (from equipment) for(int i=0; i<n; ++i) printf("out[%d]=%x ", i, out[i]); 我还尝试用 p_ID[0]=out[1]; p_ID[1]=out[2]; 我也尝试过sscanf和strol解决方案,但我得到了奇怪的结果。让我提供一个您正在寻找的示例 #incl

我需要在C中将字节转换为int(或uint8/16/32)。 下面是对我的代码的解释:

char* out;
//init
//out=read_udp (from equipment)
for(int i=0; i<n; ++i)
  printf("out[%d]=%x ", i, out[i]);
我还尝试用

p_ID[0]=out[1]; p_ID[1]=out[2];

我也尝试过sscanf和strol解决方案,但我得到了奇怪的结果。

让我提供一个您正在寻找的示例

 #include <stdio.h>
 #include <string.h>
 #include <stdint.h>

 #define SWAP2BYTES(val) (((val>>8)&0x00FF)|((val<<8)&0xFF00))
 bool isLittleEndian() { // just to check host endian 
   uint32_t val = 1;
   uint8_t *c = (uint8_t*)&val;
   return (1 == (uint32_t)*c);
 }
 // if the same endian, then no need to swap, otherwise swap
 #define CHECKSWAP(val) (isLittleEndian()?val:SWAP2BYTES(val))
 int main(int argc, char **argv) {
   uint8_t out[8] = {0x00,0xAA,0x44,0x12,0x2B,0x00,0x7E,0x3B};
   uint16_t id, val;

   // to prevent from alignment issue, memcpy used insted of assignment
   memcpy((uint8_t*)&id, &out[4], sizeof(id));
   memcpy((uint8_t*)&val, &out[6], sizeof(val));

   id = CHECKSWAP(id);
   val = CHECKSWAP(val);

   printf("outdata = ");
   for (int i = 0; i < sizeof(out); i++)
     printf("0x%02x ", out[i]);
   printf("\n");
   printf("Header: 0x%02x 0x%02x 0x%02x 0x%02x.\n", out[0], out[1], out[2], out[3]);
   // just to make sure whether or not intended values are retrieved
   printf("ID: %d(0x%04x), Value: %d(0x%04x).\n", id, id, val, val);

   return 0;
 }

我很难理解你的问题,但我有一种感觉,你不需要在这里转换任何东西……除非它是不同的endiannes,否则没有必要转换任何东西,只需将指针投射到正确的类型并取消引用,或者,做同样的事,使用一个内置函数来反转endiannes。类似于
*(int32_t*)&out[4]如果不是正确的值,那么可能是反向的endiannes。@IharobAlAsimi不,这不是最好的建议。如果数组没有对齐怎么办?@EugeneSh。我试图在我的问题中添加一个短语,以便更清楚,如果不够,请告诉我,我会尽量更清楚!如何使用位运算符以正确的方式组合接收的字节。类似于:unsigned short value=(out[4]完美!工作正常,能够适应我的目的!我错过了
memcpy
部分!
 #include <stdio.h>
 #include <string.h>
 #include <stdint.h>

 #define SWAP2BYTES(val) (((val>>8)&0x00FF)|((val<<8)&0xFF00))
 bool isLittleEndian() { // just to check host endian 
   uint32_t val = 1;
   uint8_t *c = (uint8_t*)&val;
   return (1 == (uint32_t)*c);
 }
 // if the same endian, then no need to swap, otherwise swap
 #define CHECKSWAP(val) (isLittleEndian()?val:SWAP2BYTES(val))
 int main(int argc, char **argv) {
   uint8_t out[8] = {0x00,0xAA,0x44,0x12,0x2B,0x00,0x7E,0x3B};
   uint16_t id, val;

   // to prevent from alignment issue, memcpy used insted of assignment
   memcpy((uint8_t*)&id, &out[4], sizeof(id));
   memcpy((uint8_t*)&val, &out[6], sizeof(val));

   id = CHECKSWAP(id);
   val = CHECKSWAP(val);

   printf("outdata = ");
   for (int i = 0; i < sizeof(out); i++)
     printf("0x%02x ", out[i]);
   printf("\n");
   printf("Header: 0x%02x 0x%02x 0x%02x 0x%02x.\n", out[0], out[1], out[2], out[3]);
   // just to make sure whether or not intended values are retrieved
   printf("ID: %d(0x%04x), Value: %d(0x%04x).\n", id, id, val, val);

   return 0;
 }
outdata = 0x00 0xaa 0x44 0x12 0x2b 0x00 0x7e 0x3b
Header: 0x00 0xaa 0x44 0x12.
ID: 43(0x002b), Value: 15230(0x3b7e).