- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试将 unsigned int
打印为十六进制,但不仅仅是使用 %08X
。我需要打印每个字节的 MSB 和 LSB 的十六进制,首先是 MSB。我已经明白了:
unsigned int num = 1234567890;
char *p = (char*)#
for (int i = 0; i < 4; i++) {
printf("%X%X", (*(p+i) & 0xF0) >> 4, *(p+i) & 0x0F);
}
// prints: D2029649
但是,我无法从包含 D2029649
的字符串返回 unsigned int
:
short dehex(char hexLetter) {
if(hexLetter > 47 && hexLetter < 58) hexLetter -= 48;
if(hexLetter > 64) hexLetter -= 55;
return hexLetter;
}
unsigned int o = 0;
char *in = "D2029649";
int len = strlen(in);
for(int i = 0; i < len; i++) {
if(i % 2 == 0) {
o |= ((unsigned char)dehex(in[i]) << 4) + dehex(in[i+1]);
o <<= 8;
}
}
不用说,这根本行不通。这两行操作 o
的代码是我尝试撤销原始编码的结果,也是我对如何将字节转回 int 所做的一些研究的结果。
也许我的麻烦来自于对生成十六进制时我实际在做什么的完全误解。
有人有任何提示可以让我朝正确的方向前进,将十六进制恢复为原始的无符号整数吗?
最佳答案
您的练习的目的似乎是根据内存布局将整数转换为字符串,然后再将其转换回来。
否则,您就不会费力地尝试弄清楚您是否位于字节边界上,然后进行位移“体操”。相反,您只需将值左移四位并添加下一个数字,例如:
#include <stdio.h>
#include <string.h>
short dehex (char hexLetter) {
if ((hexLetter >= '0') && (hexLetter <= '9'))
return hexLetter - '0';
return hexLetter - 'A' + 10;
}
int main (void) {
unsigned int o = 0;
char *in = "D2029649";
int len = strlen (in);
for (int i = 0; i < len; i++)
o = (o << 4) + dehex (in[i]);
printf ("%X\n", o);
return 0;
}
你会注意到我稍微改变了 dehex
函数,因为我不太喜欢魔法数字,其中字符常量更具可读性(它仍然不能移植到所有实现,例如例如 EBCDIC,但现在这样的东西已经很少了)。
该程序将从该字符串中以大写十六进制输出无符号整数值进行检查:D2029649
。
但是,十进制值 1234567890
的十六进制为 499602D2
,其字节顺序与字符串中的顺序相反。那是因为您采用的是所谓的小端架构。
所以你有两个问题。
首先是您以错误的顺序处理字节以获取原始数字。
您需要从字符串的末尾开始向后工作,例如:
for (int i = len - 2; i >= 0; i -= 2) ...
第二个是您以错误的顺序执行添加/移位操作。
因为您的原始代码在添加后发生了移位,因此它到达D2029649
,然后将其左移八位,结果为02964900
- D2
从左侧移入遗忘状态,并在右侧移入零字节。您需要移动然后添加:
o <<= 8;
o |= ((unsigned char)dehex(in[i]) << 4) + dehex(in[i+1]);
最后,虽然不是必需的,但如果您仅使用 unsigned char 返回转换后的 nybble,则可以大大简化代码。我将编写的代码如下所示:
#include <stdio.h>
#include <string.h>
unsigned char dehex (char hexLetter) {
if ((hexLetter >= '0') && (hexLetter <= '9'))
return hexLetter - '0';
return hexLetter - 'A' + 10;
}
int main (void) {
unsigned int num = 1234567890;
char *p = (char*) #
for (int i = 0; i < 4; i++)
printf("%X%X", (*(p+i) & 0xF0) >> 4, *(p+i) & 0x0F);
putchar ('\n');
unsigned int o = 0;
char *in = "D2029649";
int len = strlen (in);
for (int i = len - 2; i >= 0; i -= 2) {
o <<= 8;
o |= (dehex (in[i]) << 4) + dehex (in[i+1]);
}
printf ("%X, or %u\n", o, o);
return 0;
}
请注意,一次处理一个字节而不是一次处理一个半字节更有意义。使用基于 nybble 的代码,您必须按照 6, 7, 4, 5, 2, 3, 0, 1
的顺序进行数组索引,而不是一个漂亮的小 0..7
循环。
该程序的输出是:
D2029649
499602D2, or 1234567890
表明您正在取回原始号码。
关于基于 8 个十六进制字节创建一个 unsigned int,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12719107/
我不知道下面的代码有什么问题,它应该读取数字并将它们的值与位置放在一个成对的 vector 中,然后对它们进行排序并打印出位置。我用 sort 删除了部分 - 我认为问题就在那里,但我再次收到编译错误
我相信当您将两个 unsigned int 值相加时,返回值的数据类型将是 unsigned int。 但是两个 unsigned int 值相加可能会返回一个大于 unsigned int 的值。
我从左移得到的结果我找不到解释。 unsigned char value = 0xff; // 1111 1111 unsigned char = 0x01; // 0000 0001 std::c
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 8 年前。 Improve th
根据:http://en.wikipedia.org/wiki/C_data_types您可以使用 unsigned short 类型或 unsigned short int 类型。但是它们之间有什么
我正在尝试在 arduino 草图中实现 CRC16。从网上拿到了crc.c文件,想试试看。我创建了其他文件以允许 crc.c 正确运行。这是我的文件。 crc.h: #ifndef CRC_C_ #
我正在尝试实现一个将存储相关索引的列表。但是,我在标题中提到的 for (index_itr = (list_size - numberOfEvents - 1) 处遇到错误。我在做什么错误,以及如何
这不是跨平台代码...所有内容都在同一平台上执行(即字节序是相同的......小字节序)。 我有这个代码: unsigned char array[4] = {'t', 'e', 's', '
我有一个 8 位 unsigned char vector 和一个 16 位 unsigned short vector std::vector eight_bit_array; std::vecto
这个问题在这里已经有了答案: Is subtracting larger unsigned value from smaller in C++ undefined behaviour? (2 个答案
这个问题已经有答案了: Difference between unsigned and unsigned int in C (5 个回答) 已关闭 6 年前。 在 C 语言中,unsigned 之间有
我遇到了一个我不太理解的警告。该警告是通过比较我认为是一个未签名的内容与另一个未签名的内容而生成的。 来源如下: #include #include #include #include int
好吧,这一定很愚蠢。我在移动一些代码时遇到了这个问题,并认为我打错了字或未能正确使用调试器。作为健全性检查,我创建了这个测试用例,但它似乎仍然失败。 unsigned int vtxIdx
我有一个同事不热衷于使用现代 C++ 例如,当我要求他开始使用 r_value 引用时,他不会这样做。当我要求他使用 std::array 而不是 c 数组(char example[8])时,他不会
我有一个无符号字符数组,例如Data[2]。我需要它来与返回 unsigned int 的函数的输出进行比较。 我尝试将 Data[2] 转换为 unsigned int,反之亦然。它没有用。 我想做
我遇到了一个我不太明白的警告。警告是通过将我认为是未签名的与另一个未签名的进行比较而生成的。 这是来源: #include #include #include #include int mai
在下面的程序中,我使用了 unsigned 关键字。 #include int main() { unsigned char i = 'A'; unsigned j
整数值转换为浮点值并再次返回时是否与原始整数值相同? 例如: unsigned x = 42; double y = x; unsigned z = y; 假设编译器没有优化浮点转换,x == z 是
这个问题在这里已经有了答案: Difference between unsigned and unsigned int in C (5 个答案) 关闭 9 年前。 我理解 unsigned 和 un
您好,我遇到了一个关于位运算的小概念问题。请参阅下面的代码,其中我有一个 4 字节的无符号整数。然后我通过将地址分配给无符号字符来访问各个字节。 然后我将最后一个字节的值设置为 1。并对 unsign
我是一名优秀的程序员,十分优秀!