
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で質問しましょう!
似たような質問が見つかりました
- TOEFL・TOEIC・英語検定 bitとlittleは両方ともに同じ 1 2022/08/10 13:03
- Visual Basic(VBA) VBAでArrayListを使う為の「mscorlib.tlb」の参照設定について 3 2022/03/23 19:45
- その他(プログラミング・Web制作) Visual Studio Code 関数の使い方について 3 2023/05/31 13:15
- Excel(エクセル) Excel 2019 32-bit版を64-bit版にするには? 8 2023/07/28 14:20
- その他(Microsoft Office) 折れ線グラフ、同じ項目の色 4 2022/12/23 15:46
- 英語 英文和訳についての質問です。 2 2023/06/23 06:38
- その他(AV機器・カメラ) オーディオインターフェイスの24bitなど量子化bit数はどこで設定できるのでしょうか? 1 2022/06/26 07:58
- C言語・C++・C# アセンブラ指令 3 2023/06/17 14:47
- オープンソース stable diffusionのインストールがうまくいきません。 1 2023/06/20 13:09
- 英語 わからない英文があります。 4 2022/11/16 07:25
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルVBAで「〜」が表現でき...
-
「C#」文字コードの取得&文字変換
-
COBOLで半角カナを全角カナに変換
-
秒を時分秒へ変換
-
Visual Studio 6.0でビルド可能...
-
javaでのOracleのデータ登録の...
-
シフトJISのエンコード
-
JavaでUTF-8の文字への復元
-
jspの文字化けについて
-
特殊文字「\\」の変換の方法
-
PerlプログラムをJavaに変換す...
-
jspでString型からlong型への変換
-
電卓プログラムでかっこを対応...
-
魚眼画像から(パノラマのよう...
-
javaで質問です。 文字列2023/2...
-
Path型をString型へ変換する(Java)
-
java 初心者ですが・・・・
-
Visual Basic でのコードをASCI...
-
10進201、16進C9 のASCIIコー...
-
JAVAソースコードの暗号化
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ダブルクォーテーションのrepla...
-
javaで質問です。 文字列2023/2...
-
javascriptで文字列のsjis利用...
-
Path型をString型へ変換する(Java)
-
カタカナをローマジに変換する。
-
Visual Basic でのコードをASCI...
-
JavaのStringクラスに「外字」...
-
エクセルVBAで「〜」が表現でき...
-
Windows-31Jからutf-8への変換...
-
C言語32bitから64bitの移行につ...
-
文字列の比較
-
int型のゼロ埋め
-
javaの初歩的な質問です。
-
byte型のマイナスの扱いについて
-
substring バイト単位でやりたい
-
JAVAでのShift-JISとEUC-JP間の...
-
byte配列をImageに変換する
-
byte[] を long,float とかに...
-
UTF-8とUnicodeの互換性
-
COBOLで半角カナを全角カナに変換
おすすめ情報