- 論壇徽章:
- 0
|
最近在處理64位網(wǎng)絡(luò)傳輸中遇到一些問題,下面是解決的一些過程和記錄的筆記.
ntoh64整個(gè)函數(shù)為前輩所寫,在CSDN上查找到,對此表示感謝.
int64位在LINUX表示為 long long,有一種表示方式為int64,目前沒有找到相關(guān)頭文件和相關(guān)資料。
如果為網(wǎng)絡(luò)傳輸。
第一種方法:當(dāng)作字符串傳輸
第二種方法:linux在byteswap.h頭文件里面提供了bswap_64這個(gè)宏,可以通過bswap_64來對字符順序進(jìn)行轉(zhuǎn)換。
測試大小端字符序列
#include
#include
int main ()
{
long long c = 0x1234567812345679;
long long d=bswap_64(c);
//小端字符到大端字符
if (*(char *)&d == 0x12)
printf ("Big endian\n");
else if (*(char *)&d == 0x79)
printf ("Little endian\n");
//大端字符到小端字符
long long h=bswap_64(d);
if (*(char *)&h == 0x12)
printf ("Big endian\n");
else if (*(char *)&h == 0x79)
printf ("Little endian\n");
return 0;
}
Linux端傳輸?shù)絎INDOWS先轉(zhuǎn)換為網(wǎng)絡(luò)的大端字符序,代碼如下:
#include
#include
#include
#include
int main()
{
int fd;
fd = open("file.txt", O_RDWR|O_CREAT|O_TRUNC);
long long data = 135407575609;
printf("%I64d\n", data);
//cover big
data = bswap_64(data);
printf("%I64d\n", data);
//write cover big
write(fd, &data, sizeof(data));
printf("%I64d\n", data);
data = 0;
long long a;
read(fd, &a, sizeof(a));
data = bswap_64(a);
printf("%I64d\n", a);
close(fd);
return 0;
}
WINDOWS收到文件后根據(jù)需要看是否將網(wǎng)絡(luò)的大端字符序轉(zhuǎn)換為本地相應(yīng)的字符序,代碼如下:
#include
long long ntoh64(long long inval)
{
long long outval = 0;
int i=0;
for(i=0;i> (i *8))&255);
return outval;
}
int main()
{
FILE *fp;
fp = fopen("file.txt", "rb+");
long long buf=0;
fread(&buf, sizeof(buf), 1, fp);
printf("Read Data:%I64d\n", ntoh64(buf));
fclose(fp);
return 0 ;
}
測試結(jié)果 :可以正確讀取他們的數(shù)據(jù)并顯示.
WINDOWS XP 顯示結(jié)果:
D:\source>test
Read Data:13540757560943242
Linux發(fā)送端顯示結(jié)果:
[hq@h21 test]$ ./rea
1281942154
1058746368
1058746368
1058746368
由于printf顯示長度問題所以導(dǎo)致顯示結(jié)果與實(shí)際結(jié)果不一樣.在GDB里面調(diào)試查看出結(jié)果與預(yù)期輸入結(jié)果一樣.
file.txt文件采用flashget下載到本地.使用md5sum檢驗(yàn)文件傳輸過程沒有出錯(cuò).
本文來自ChinaUnix博客,如果查看原文請點(diǎn):http://blog.chinaunix.net/u/8266/showart_276380.html |
|