
A 回答 (5件)
- 最新から表示
- 回答順に表示

No.5
- 回答日時:
>バイトオーダーを行っています。
htonlやntohlの64bit版はないのでしょうか?バイトオーダーを行っています。・・この意味が不明です。
バイトオーダーの変換を行っています。と理解します。
linux32bitで動いているC言語のアプリを、linux64bitに移行する場合、
無条件にバイトオーダーの変換を行うなら、htonlやntohlを使うべきではありません。
これは、実行時のマシンがsparc系(ビッグエンディアン)なら、一切データの変換は行われません。
実行時のマシンがINTEL系(リトルエンディアン)の場合に、エンディアン変換を行います。
そもそも、エンディアン変換を行うのは、ネットワーク通信でポート番号及びIPアドレスを変換する場合のみです。IPV6については、判りませんが、少なくともIPV4環境では、htnl,ntohlの64ビット版は必要ありません。(64ビットアプリでもhtnl,ntohlを使用すればIPアドレスの変換を正しく行えます)
無条件に64ビットデータ(8バイトデータ)のエンディアン変換をしたい為に、htnl,ntohlの64ビット版がほしいといわれているように見えますが、そうであれば、そもそも、32ビットアプリの時に
その機能を実装しているのではないでしょうか?
long型のデータを通信相手に送信する場合、32ビットアプリでは4バイトのデータを送りますが、
64ビットアプリでは8バイトのデータを送ることになりますが、これは、そもそもあってはならないことです。つまり、送信側の都合で(32ビットから64ビットアプリに変わったという理由で)、送るデータのサイズが変化してはいけない筈です。
つまり、32ビットアプリの時点で、4バイトのバイトオーダ変換をしている場合は、
64ビットでも4バイトのバイトオーダー変換をすべきです。
又、つまり、32ビットアプリの時点で、8バイトのバイトオーダ変換をしている場合は、
その時点で8バイトのバイトオーダー変換の機能を実装しているはずなので、新たにその機能を求める必要はないということです。
以上が、htnl,ntohlの64ビット版に対する回答ですが、無条件にバイトオーダーの変換を行う機能が
欲しいいうことであれば、linuxでは16ビット、32ビット、64ビットようにバイトオーダーのスワップマクロが提供されています。
bswap_16、bswap_32、bswap_64がありますのでそれが、使用可能です。
以下、使用サンプルです。
---------------------------------------
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <byteswap.h>
dump(char *name,int len,void *ptr)
{
int i;
unsigned char *p = (unsigned char*)ptr;
printf("%s=",name);
for(i=0;i < len; i++,p++){
printf("%02X",*p);
}
printf("\n");
}
int main(int argc , char *argv[])
{
//64ビット環境あることの確認
long long1;
short short1;
int int1;
long long int longlong1;
printf("sizeof long=%d\n",sizeof(long1));
printf("sizeof short=%d\n",sizeof(short1));
printf("sizeof int=%d\n",sizeof(int1));
printf("sizeof long long=%d\n",sizeof(longlong1));
long1 = 0x0123456789ABCDEFLL;
short1 = 0xABCD;
int1 = 0x1234ABCD;
longlong1 = 0x123456789ABCDEF0LL;
//スワップ前
dump("long1",8,&long1);
dump("short1",2,&short1);
dump("int1",4,&int1);
dump("longlong1",8,&longlong1);
long1 = bswap_64(long1);
short1 = bswap_16(short1);
int1 = bswap_32(int1);
longlong1 = bswap_64(longlong1);
//スワップ後
dump("long1",8,&long1);
dump("short1",2,&short1);
dump("int1",4,&int1);
dump("longlong1",8,&longlong1);
return 0;
}
------------------------------------------------
以下、実行結果です。
sizeof long=8
sizeof short=2
sizeof int=4
sizeof long long=8
long1=EFCDAB8967452301
short1=CDAB
int1=CDAB3412
longlong1=F0DEBC9A78563412
long1=0123456789ABCDEF
short1=ABCD
int1=1234ABCD
longlong1=123456789ABCDEF0
----------------------------------------------
CentOS release 6.3 (Final)
Kernel 2.6.32-279.el6.x86_64 on an x86_64
で実行しました。
gcc version 4.4.6 20120305 (Red Hat 4.4.6-4) (GCC)
で、-m64 オプションでコンパイル&リンクした結果です。
No.3
- 回答日時:
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
javascriptで文字列のsjis利用...
-
Path型をString型へ変換する(Java)
-
javaで質問です。 文字列2023/2...
-
C言語32bitから64bitの移行につ...
-
javaの初歩的な質問です。
-
ダブルクォーテーションのrepla...
-
JavaのStringクラスに「外字」...
-
半角カタカナをローマ字変換す...
-
文字化け対策について
-
error C2440: 'static_cast' : ...
-
jspでString型からlong型への変換
-
スマホでテキストボックスの随...
-
オブジェクトの中のプロパティ...
-
JSPでDBからデータ読み込みブラ...
-
ループ処理の際、最後だけ","を...
-
ORA-01858: 数値を指定する箇所...
-
system.out.printが出力されない
-
行の途中から読み込む方法
-
IF関数でEmpty値を設定する方法。
-
System.err. printlnとSystem.o...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
javaで質問です。 文字列2023/2...
-
ダブルクォーテーションのrepla...
-
javascriptで文字列のsjis利用...
-
int型のゼロ埋め
-
javaの初歩的な質問です。
-
Path型をString型へ変換する(Java)
-
C言語32bitから64bitの移行につ...
-
JavaのStringクラスに「外字」...
-
エクセルVBAで「〜」が表現でき...
-
カタカナの「ソ」以降の文字が...
-
Windows-31Jからutf-8への変換...
-
pasteHTMLでパスが勝手に変換さ...
-
DBから取得したデータの文字化け
-
数字のみにしたい
-
Visual Basic でのコードをASCI...
-
ジェネリックのキャストをした...
-
補数について質問
-
publicがprotectedになった場合...
-
error C2440: 'static_cast' : ...
-
文字を整数(int)に変換
おすすめ情報