【问题标题】:C/C++ read a byte from an hexinput from stdinC/C++ 从标准输入的十六进制输入中读取一个字节
【发布时间】:2009-02-07 04:59:30
【问题描述】:

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

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

我已尝试使用以下代码来读取输入:

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

这一切都很好,但是我如何将 2bytes 拆分为 1bytes uint8_t 值(或者甚至可能只读取第一个字节)。想从输入中读取第一个字节,并将其存储在字节矩阵中的选择位置。

uint8_t matrix[50][50]

由于我在格式化/读取 C/C++ 中的输入方面不是很熟练(并且到目前为止只使用了 scanf),因此非常感谢任何其他关于如何轻松完成此操作的想法(如果可以的话,速度很快)。

编辑:通过使用 fread 函数找到了一种更好的方法,因为它可以指定应该从流(在本例中为标准输入)读取多少字节并保存到变量/数组中。

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

参数

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

size - 要读取的每个元素的大小(以字节为单位)。

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

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

cplusplus ref

【问题讨论】:

    标签: c++ byte stdin scanf


    【解决方案1】:

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

    要只读取一个字节,试试这个:

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

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

    【讨论】:

    • "%2x" 仍然需要一个无符号整数,因此您的代码具有未定义的行为。这可能适用于小端机器,但不适用于大端机器。您想改用“%hhx”。
    • @Rosenfield,啊,我在写答案时忽略了这一点(但在考虑时考虑到了)。此外,hh 修饰符是非标准的(特定于 GCC)。
    • 我仍然认为字节序不是问题。在执行所有这些操作时,编译器足够聪明,可以将 byteTmp 视为单个数字,而不是 4 个字节,因此当您读入它时,您会得到一个 1 字节的数字放入一个 4 字节的值中,一切正常。当你施放时,它会占用正确的位。
    • @Postow,Rosenfield 指的是我的原始代码(直接扫描到 uint8_t,这是非法的)。
    【解决方案2】:

    你应该可以像这样拆分变量:

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

    【讨论】:

    • 那里可能存在字节序问题。
    • 不可能,因为数字就是数字就是数字,总是大端在左边。仅当您有必须解释的比特流时才会出现字节序问题...
    • 其实这很有趣:如果文本的字节序和系统的字节序不同,从流中读取时会交换两个字节,但随后低字节和高字节是正确的,因为字节再次交换。不过,我更愿意安全行事,不要担心。
    • 没错。或者,您可以将其视为右移,不一定是第一个字节中的 8 位,而是左移 8 位,当被视为正常的 16 位数字(不是 2 字节数字)时
    【解决方案3】:

    一些想法:

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

    2) 如果你知道有 4 个 hexits 的倍数,你可以只读取两个字节,然后转换成一个字节的值 high = twobytes

    3) %2x

    【讨论】:

    • 你的意思可能是高 = 双字节 >> 8
    • 或者你有字节序问题;-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-09
    • 2010-12-08
    • 2012-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多