我有以下代码:
std::istream is;
// ... stream initialization ...
while(is)
{
uint32_t next4Bytes = 0;
is.read(reinterpret_cast<char*>(&next4Bytes), 4);
if(next4Bytes == 218893066)
{
is.seekg(-4, std::ios_base::cur);
break;
}
else
is.seekg(-3, std::ios_base::cur);
}
除了reinterpret_cast<char*>
还有其他更好的方法可以将std::istream
的4个字节读入uint32_t
吗? (显然不是c式演员)
答案 0 :(得分:7)
我认为没有,我认为你不需要。你需要四个字节并重新解释它们; reinterpret_cast
正好描述了你的意图。
答案 1 :(得分:5)
您可能希望将该演员表包装在模板化的阅读器功能中:
template<typename T>
std::streamsize read(T* out, std::istream& stream, size_t count=1) {
stream.read(reinterpret_cast<char*>(out), sizeof(T)*count);
return stream.gcount();
}
如果你不在乎阅读数组,你甚至可以省略count参数,让它更简单。有一些方法可以根据自己的需要进行修改。如果您对实际读取的值有多少感兴趣而不是读取了多少字节,则可以将其除以sizeof(T),而不是仅返回gcount。 (这与fread的返回值非常相似)。或者,如果不能读取所有数据,您可以抛出异常。
答案 2 :(得分:1)
您可以使用C风格的演员表,实际上相同但更短写
<?php
createimageinstantly();
//$targetFolder = '/gw/media/uploads/processed/';
//$targetPath = $_SERVER['DOCUMENT_ROOT'] . $targetFolder;
//$img3 = $targetPath.'img3.png';
//print_r(getimagesize('http://www.vapor-rage.com/wp-content/uploads/2014/05/sample.jpg'));
function createimageinstantly($img1='',$img2='',$img3=''){
$x=$y=600;
header('Content-Type: image/png');
$targetFolder = '/gw/media/uploads/processed/';
$targetPath = $_SERVER['DOCUMENT_ROOT'] . $targetFolder;
$img1 = $targetPath.'img1.png';
$img2 = $targetPath.'img2.png';
$img3 = $targetPath.'img3.png';
$outputImage = imagecreatetruecolor(600, 600);
// set background to white
$white = imagecolorallocate($outputImage, 255, 255, 255);
imagefill($outputImage, 0, 0, $white);
$first = imagecreatefrompng($img1);
$second = imagecreatefrompng($img2);
$third = imagecreatefrompng($img3);
//imagecopyresized ( resource $dst_image , resource $src_image , int $dst_x , int $dst_y , int $src_x , int $src_y , int $dst_w , int $dst_h , int $src_w , int $src_h )
imagecopyresized($outputImage,$first,0,0,0,0, $x, $y,$x,$y);
imagecopyresized($outputImage,$second,0,0,0,0, $x, $y,$x,$y);
imagecopyresized($outputImage,$third,200,200,0,0, 100, 100, 204, 148);
imagepng($outputImage, $targetPath .round(microtime(true)).'.png');
imagedestroy($outputImage);
}
?>
答案 3 :(得分:0)
这个想法是read
读取字节,而不是>>
运算符,它是一个高级构造。
您将字节读取到char
或unsigned char
,因为这是字节的全部内容。试图解决这个问题几乎取消了read
读取字节的目的。
因此,如果困扰您的是reinterpret_cast
的详细程度,请使用模板。
如果您需要将字节读入整数,那么首先尝试将整数存储为字符串,然后使用正确的>>
运算符将其解压缩。