C / C ++从stdin的hexinput读取一个字节

时间:2009-02-04 19:35:53

标签: c++ byte stdin scanf

无法在C / C ++中找到如何执行以下操作的方法。

输入:十六进制值,例如:ffffffffff ...

为了阅读输入,我尝试了以下代码:

uint16_t twoBytes;
scanf("%x",&twoBytes);

这样可以正常工作,但是如何将2字节分成1个字节uint8_t值(或者甚至可以只读取第一个字节)。想从输入读取第一个字节,并将其存储在选择位置的字节矩阵中。

uint8_t matrix[50][50]

由于我不熟练使用C / C ++中的输入格式化/读取(到目前为止只使用了scanf),因此非常感谢任何其他关于如何轻松实现这一目标的想法(如果能够快速完成)。< / p>

编辑:通过使用fread函数找到更好的方法,因为它允许指定它应该从流中读取多少字节(在本例中为stdin)并保存到变量/数组。

size_t fread ( void * ptr, size_t size, size_t count, FILE * stream );

参数

ptr - 指向最小大小为(size * count)字节的内存块的指针。

size - 要读取的每个元素的字节大小。

count - 元素数量,每个元素的大小为字节大小。

stream - 指向指定输入流的FILE对象的指针。

cplusplus ref

3 个答案:

答案 0 :(得分:2)

%x读取unsigned int,而不是uint16_t(认为它们在您的特定平台上可能相同)。

要只读一个字节,请尝试:

uint32_t byteTmp;
scanf("%2x", &byteTmp);
uint8_t byte = byteTmp;

这读取unsigned int,但在读取两个字符(两个十六进制字符等于8位或一个字节)后停止。

答案 1 :(得分:0)

您应该能够像这样拆分变量:

uint8_t LowerByte=twoBytes & 256;
uint8_t HigherByte=twoBytes >> 8;

答案 2 :(得分:0)

有几点想法:

1)将其作为字符读取并手动转换 - 痛苦

2)如果你知道有4个十六进制的倍数,你可以只读取两个字节然后转换为一个字节值,其中high = twobytes&lt;&lt; 8;低= twobyets&amp; FF;

3)%2x