希望你能在这里帮助我:)。
我订购了一个RFID标签和扫描仪供业余爱好者使用。标签正在向标签发送输入,我想在C程序中使用。
问题是..标签正在发送十六进制代码 - 10个字符 - 长。
我试图将这个数字存储在一个long long int变量中,但它似乎不起作用。
当我使用printf打印变量时,只打印前8个字符。其余的(剩下2位数字)。
long long int n1;
n1 = recieve_data();
printf("%lx", n1);
我也试过自己输入10位十六进制数字,这样做:
long long int n1;
scanf("%lx", &n1);
printf("%lx", n1);
我在F中输入10位数0,但只打印8位数/字符。
必须存在某种整数溢出,但据我所知:
十六进制1位= 4位。那么10位十六进制数字= 40位? - long long int应该足够了!
如果我的直觉是正确的,并且发生了整数溢出,那么我该如何解决这个问题呢?显然没有变量大到足以容纳10位十六进制值?
祝你好运 尼古拉斯 - 丹麦
答案 0 :(得分:4)
你确定你的long long int是64位宽,你的环境,嵌入式,PC,32位还是64位?编译器?
如果你的编译器像gcc一样符合C99,你也可以使用stdint.h
和uint64_t
保证独立于64位宽。
您应该重新检查printf()
文档,例如在我的64位OpenSuse框中,gcc long
以及long lont int
通过sizeof()
为64位宽。要打印它们,我使用:
printf(" %llx ",hexNumber)
答案 1 :(得分:3)
10个十六进制字符只有40位。 long long int
保证至少为64位,因此可以使用。
问题实际上在您的printf格式字符串中 - %lx
是unsigned long int
的正确格式字符串,而不是long long int
。要打印long long int
,您应该使用%lld
- 如果要以十六进制打印,则应将其声明为unsigned long long int
,然后使用%llx
。
答案 2 :(得分:1)
您正在使用%lx进行扫描和打印。
据我所知,格式字符串%lx是一个long int,而不是long long int。根据您的硬件,您可能只获得32位长整数。
其他一个人提出了%llx,对于long long int。试试这件事并不会有什么坏处。
答案 3 :(得分:0)
将数字输入管理大小的部分并将其存储为字符串。无限长的那种方式。
答案 4 :(得分:0)
标签以十六进制发送代码--10个字符
我很确定你的意思是“标签将RFID作为10个字符的ASCII字符串发送,仅限于16个十六进制数字”
我试图将这个数字存储在一个long long int变量中,
为什么
int
及其朋友是算术类型。您可以使用它们来存储计划执行算术运算的值。你递增它们,向它们添加73,将它们向左移位3,按位或它们,或者将它们用作索引。
但RFID只是名称。你没有对名称做任何这些事情,因为这样做没有意义。你不会说“kermit the frog”+8,或“miss piggy”<< 7或“fozzie bear”%3。 RFID就是这样。你只需阅读RFID,比较它们,或者哈希,然后将它们写出来。它们是不可分割的,不可思议的“魔法曲奇”字符串 - 它们只是代币。
所以你应该把它存储为一个字符串。将它读入int然后将其写回int中的字符串会产生两个不必要的转换,它在语义上毫无意义。