将字节打印为 longlong
Print bytes as longlong
我有一个指向 196 字节块的空指针。我需要将连续字节打印为 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;
}
使用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
数组中读取 LONGLONG
s。
如果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
。
我有一个指向 196 字节块的空指针。我需要将连续字节打印为 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;
}
使用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
数组中读取 LONGLONG
s。
如果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
。