cwnicol programming

プログラミング関連の投稿をすこしだけ

float型をhtonl(), ntohl()

int main(){
	int i;
	char *p;
	float f = 1;
	
	for(i = 0;i < sizeof(float);i++){
		p = (char *)&f;
		printf("%02X ", (char)*(p + i));
	}
	putchar('\n');
		
	f = htonl(f);
	//f = htonl(*(long *)&f);
	
	for(i = 0;i < sizeof(float);i++){
		p = (char *)&f;
		printf("%02X ", (char)*(p + i));
	}
	putchar('\n');
	
	return 0;
}


結果:

00 00 FFFFFF80 3F 
00 00 00 00 


1バイトごとに16進で出力したいのに、うまくできないや。。
なんだかよく分からないが、float型をhtonlしたい時には、
long型と同じようにhtonlしちゃうと、値が消えてる?


んで

f = htonl(*(long *)&f);

とか、してみるとなんとなくうまくいってんのかな?
以下ソース。

int main(){
	int i;
	char *p;
	float f = 1;
	
	for(i = 0;i < sizeof(float);i++){
		p = (char *)&f;
		printf("%02X ", (char)*(p + i));
	}
	putchar('\n');
		
	//f = htonl(f);
	f = htonl(*(long *)&f);
	
	for(i = 0;i < sizeof(float);i++){
		p = (char *)&f;
		printf("%02X ", (char)*(p + i));
	}
	putchar('\n');
	
	return 0;
}

結果:

00 00 FFFFFF80 3F 
00 3F 00 47 


検証すらできてないけども、とにかく4バイトものは
上記のようにしてみるとうまくいくよう。
(htonsの場合はlong→shortに置き換える)


上記がややこしい場合には、long型の変数に一旦
キャストし値を代入する。その上でhtonlを
使用する。