我收到了这个警告
warning C4309: 'initializing' : truncation of constant value
Run Code Online (Sandbox Code Playgroud)
当我尝试执行我的dll时,它只发送4个字节而不是10个字节.
可能有什么不对?
这是我的代码:
int WINAPI MySend(SOCKET s, const char* buf, int len, int flags)
{
cout << "[SEND:" << len << "] ";
for ( int i = 0; i < len; i++ ) {
printf( "%02x ", static_cast<unsigned char>( buf[i] ) );
}
printf("\n");
//causing the warning:
char storagepkt[] = {0x0A, 0x00, 0x01, 0x40, 0x79, 0xEA, 0x60, 0x1D, 0x6B, 0x3E};
buf = storagepkt;
len = sizeof(storagepkt);
return pSend(s, buf, len, flags);
}
Run Code Online (Sandbox Code Playgroud)
UPDATE
int (WINAPI *pSend)(SOCKET s, const char* buf, int len, int flags) = send;
int WINAPI MySend(SOCKET s, const char* buf, int len, int flags);
Run Code Online (Sandbox Code Playgroud)
UPDATE
正如我所建议的那样我试过memcpy:
memcpy((char*) buf, storagepkt, sizeof(storagepkt));
Run Code Online (Sandbox Code Playgroud)
UPDATE
unsigned char storagepkt[] = {0x0A, 0x00, 0x01, 0x40, 0x79, 0xEA, 0x60, 0x1D, 0x6B, 0x3E};
Run Code Online (Sandbox Code Playgroud)
固定它.
Mar*_*som 18
您正在初始化char已签名的缓冲区.任何事情0x7f都超出了它可以处理的范围,并将被转换为负数.实际数据可能没问题,您可以忽略警告,尽管最好是这样做unsigned char.
至于为什么它只发送4个字节,这听起来像指针的大小.您确定代码与您使用数组完全一致,而不是传递给函数的指针吗?即使将参数声明为数组,函数也不知道数组的大小 - 您需要将数组的大小传递给函数.
我可以使用以下代码重现此警告:
char aa = 0xff;
Run Code Online (Sandbox Code Playgroud)
警告解决了
unsigned char aa = 0xff;
Run Code Online (Sandbox Code Playgroud)
(正如Mark Ransom已经指出的那样,我只是添加了一个最小的示例代码来重现警告)
| 归档时间: |
|
| 查看次数: |
25583 次 |
| 最近记录: |