我有一个十六进制ASCII格式的字符串[3x3x3x3x],变量x,x-(0 ... F)。
例如,我可以获取数据
inData = 0x30303f3f
并希望将其转换为:
outData = 0x00ff
或
inData = 0x3f3f3f3f
outData = 0xffff
如何在这里进行位操作的最佳方法,我真的只想跳过" 3s"?
// receive answer from device
if (ReceiveMsg(FLog, TLog::INFO, FSerial, &ReceiveStr))
{
int side;
char inData[4];
char serial[6];
char status;
if (sscanf(ReceiveStr.GetData(), "\x2%6s\x84%1d%4c%c", &serial, &side, &inData, &status) == 4) {
*Status = status & 0x0f;
// decode hex ASCII
int time = 0;
int j = 0;
for (int i = 3; i >= 0; i--) {
time = time + ((inData[i] & 0x0f) *(pow(16, j)));
j++;
}
*Timer = time;
result = true;
}
}
我想知道是否有任何方法可以更快地完成for循环的操作,比如位移或类似的东西?
答案 0 :(得分:0)
char inData[] = "0x30303f3f";
char outData[7] = "0x";
outData[2] = inData[3];
outData[3] = inData[5];
outData[4] = inData[7];
outData[5] = inData[9];
答案 1 :(得分:0)
final_result=source<<4 & 0xf0000000+source<<8 & 0x0f000000+source<<12 & 0x00f00000+source<<16 & 0x000f0000 ;
final_result>>=16;
答案 2 :(得分:0)
您指的是二进制数据,例如来自二进制文件的数据或内存中的数据。此数据可以十六进制格式表示为字符串:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
unsigned char data[] = { 0x30, 0x30, 0x3F, 0x3F };
int data_size = sizeof(data) / sizeof(data[0]);
char *str = malloc(data_size * 2 + 1);
int i;
for(i = 0; i < data_size; i++)
sprintf(&str[i * 2], "%02X", data[i]);
str[i * 2] = 0;
printf("%s\n", str);
return 0;
}
结果为"30303F3F"
或者数据可以存储在字符串中,但这并不常见。
int main()
{
const char *data = "0123456789";
int data_size = strlen(data);
char *str = malloc(data_size * 2 + 1);
int i;
for(i = 0; i < data_size; i++)
sprintf(&str[i * 2], "%02X", data[i]);
str[i * 2] = 0;
printf("%s\n", str);
return 0;
}
结果:"30313233343536373839"
请注意,0
是一个字符,其值为0x30
,而1
为0x31
等。这就是所有这些3来的地方从
答案 3 :(得分:0)
我想知道是否有任何方法可以更快地完成for循环……
您拥有char
数组:
- inData [4] = 0x30、0x30、0x3f,0x3f
您想要一个int
:
- 时间= 255(输出)
实际上,您可以展开循环
time = 0;
int j = 0;
for (int i = 3; i >= 0; i--) {
time = time + ((inData[i] & 0x0f) *(pow(16, j)));
j++;
}
到
time = inData[0]-48<<12|inData[1]-48<<8|inData[2]-48<<4|inData[3]-48;
(同时使用可能更便宜的移位操作,而不是pow
)。