【发布时间】:2015-09-13 19:24:56
【问题描述】:
我有不同的十六进制数据传入并存储到整数类型寄存器中。
当我使用 fprint 时,我可以看到以下内容:
0x3076
0x307c
.
.
.
但是,我想显示上述十六进制数据的十进制版本,如下所示。
12406
12412
.
.
.
理论上,假设您对第一个值执行以下操作以将其转换为十进制。
(6* 16^0)+(7 * 16^1)+(0*16^2)+(3*16^3)=6 + 112+ 0 + 12288 = 12406
所以如果我有基于字符的“0x3076”版本,并且如果我能够得到每个字符 6 - 7 - 0 - 3,我可以计算小数!
所以,我决定将“3076”除以 1000。我本来应该得到 3,但我得到了两个字符!但是,如果我能够在“307c”的剩余部分中获得 3,我将无法获得“C”。如果是十进制,这可能不是十六进制!
另外,我尝试了“strtol”命令。当我使用 Cygwin 编译我的代码时,我不确定错误在哪里!我做错了什么?
所以,我只需要找到一种方法来从 HEX 数据中获取每个单个字符!
有什么想法吗?
附言
这是我的代码,以帮助您给我一个想法。
int get_readings(int source, int phase, int max_tries)
{
uint8_t buf[MAX_IEC1107_MSG_BODY];
uint8_t inbuf[MAX_IEC1107_MSG_BODY];
int inlen;
uint8_t *s;
int32_t value;
int status;
double voltage;
double current;
double active_power;
double reactive_power;
double apparent_power;
double power_factor;
double frequency;
s = buf;
*s++ = HOST_CMD_GET_READINGS_PHASE_1 + phase;
*s++ = 0x00;
if (max_tries != 1)
meter_set_max_tries(&emeter[source].meter_msg, max_tries);
if (meter_exchange(&emeter[source].meter_msg, buf, 2, inbuf, &inlen)
&&
inbuf[1] != 0xFF)
{
emeter[source].no_response = FALSE;
s = inbuf;
/* Get current readings */
value = (s[3] << 8) | s[2];
fprint(stderr, "value:" %p\n, value); // this give me HEX code
。 . .
【问题讨论】:
-
如果数字在整数变量中,那么它不会以十六进制存储。您只是(大概?)使用 %x 说明符使用 fprintf 将其打印为十六进制。尝试使用 %u 打印相同的数字。
-
如果你想知道为什么出错,你真的必须发布你的代码,以及你的确切输入和输出。
-
@Weather Vane;我刚刚添加了我的代码。谢谢!
-
@ooga:当我使用“%p”以外的时候,我会得到错误的数字!我怎么知道?因为它应该给我一些 120 V 左右的数字,这是我的电压!