我正在写一个向stdout输出随机字节的(dotnet)程序。
然后,这些字符将通过管道输入到另一个使用libc read
函数的程序中。
{
char v4[76]; // [rsp+0h] [rbp-50h] BYREF
int buf; // [rsp+4Ch] [rbp-4h] BYREF
read(0, &buf, 4uLL);
if ( buf >= 0 )
{
read(0, v4, buf);
return 0LL;
}
else
{
fwrite("Size must be greater than zero.\n", 1uLL, 0x20uLL, stderr);
return 0xFFFFFFFFLL;
}
}
字符串
下面这样的随机字符会导致buf
始终小于零。�0�S�52$N�CJ�p�7r�]�-?���1}n" ��
个
任何解释都是值得赞赏的。目标是进入if
块。
1条答案
按热度按时间gwbalxhn1#
在思考了这一点之后,我认为有两件事正在发生:
可能性1 --您只是没有在流的前面加上一些字节。
您链接的C代码查看前4个字节,并期望它们是一个 *signed int *,这取决于系统,它可能意味着多种情况,但在大多数情况下,它将是一个32位signed integer存储类。
如果它是伪随机字节,则有50:50的可能性,您的第一位将始终将其设置为负值。
可能性2 --当您写入流时,您的字节顺序在. net中被转换,而您没有意识到这一点。
像
htonl
和ntohl
这样的函数可以解决这个问题。“在C语言中,您可以在<arpa/inet.h>中找到它们。如果您确实正在写入字节,请尝试在进行管道传输之前将字节的
int
数量设置为网络字节顺序,然后在它们到达时将其转换回主机字节顺序。