【问题标题】:Print bytes as longlong打印字节为 longlong
【发布时间】:2019-12-05 05:50:51
【问题描述】:

我有一个指向 196 字节块的 void 指针。我需要将连续字节打印为 LONGLONG(__int64) 值。我正在使用以下块进行打印,但观察到应用程序崩溃。 我究竟做错了什么? 有更好的方法吗?

        LONGLONG* llx = 0;
        void *ptr = evt.MofData;
        for (int i = 0; i < evt.MofLength; i += 8)
        {
            llx = reinterpret_cast<LONGLONG*>(ptr);
            sprintf_s(msgbuf, "szof(LL[%d]), val[%ll]\n ", sizeof(LONGLONG), (*llx));
            OutputDebugString(msgbuf);
            llx = (LONGLONG *)llx + 1;
        }

【问题讨论】:

  • 1) 196 % 64 != 0, 2) 在for 循环的第一行中覆盖llx,所以最后一行llx = ... + 1; 什么都不做。

标签: c++ windows msdn


【解决方案1】:

使用memcpy:

constexpr std::size_t length = 196;
constexpr std::size_t n_blocks = length / sizeof(LONGLONG);
LONGLONG llx[n_blocks];
std::memcpy(llx, ptr, n_blocks * sizeof(LONGLONG));

现在您可以从llx 数组中读取LONGLONGs。

如果length不是编译时常量,可以使用std::vector

const std::size_t length = get_length();    // not a compile-time constant
const std::size_t n_blocks = length / sizeof(LONGLONG);
std::vector<LONGLONG> llx(n_blocks);
std::memcpy(llx.data(), ptr, n_blocks * sizeof(LONGLONG));

另外,sizeof should be %zu%Iu 返回的值的类型说明符,而不是 %d。对于long long,它应该是%lld

【讨论】:

    猜你喜欢
    • 2011-05-30
    • 1970-01-01
    • 1970-01-01
    • 2023-01-07
    • 1970-01-01
    • 2016-11-15
    • 2017-06-30
    • 2021-07-05
    • 2021-10-01
    相关资源
    最近更新 更多