[英]convert 4 bytes to 3 bytes in C++
我有一個要求,需要在二進制協議中填充3個字節(24位)。 原始值存儲在int(32位)中。 實現這一目標的一種方法如下: -
Technique1: -
long x = 24;
long y = htonl(x);
long z = y>>8;
memcpy(dest, z, 3);
如果以上是正確的方法,請告訴我?
另一種方式,我不明白的實現如下
Technique2: -
typedef struct {
char data1;
char data2[3];
} some_data;
typedef union {
long original_data;
some_data data;
} combined_data;
long x = 24;
combined_data somedata;
somedata.original_data = htonl(x);
memcpy(dest, &combined_data.data.data2, 3);
我不明白的是,如果3個字節最終在combined_data.data.data2中而不是第一個字節應該進入combined_data.data.data1,接下來的2個字節應該進入combined_data.data.data2?
這是運行2.6.x linux和gcc的x86_64平台。
部分解決: - 在x86_64平台上,內存從右到左進行尋址。 因此,值為24的long類型的變量將具有以下內存表示
|--Byte4--|--Byte3--|--Byte2--|--Byte1--|
0 0 0 0x18
使用htonl()執行上面的long類型,內存就變成了
|--Byte4--|--Byte3--|--Byte2--|--Byte1--|
0x18 0 0 0
在struct some_data中,
data1 = Byte1
data2[0] = Byte2
data2[1] = Byte3
data4[2] = Byte4
但我的問題仍然存在,為什么不如技術1所示簡單地右移8?
一個字節需要8位:-)
int x = 24;
int y = x<<8;
移動0,你什么都沒改變。 1 - * 2,2 - * 4,8 - * 256。
如果我們在BIG ENDIAN機器上,則將4個字節放入內存中,因為:2143。並且這樣的算法對於大於2 ^ 15的數字不起作用。 另一方面,在BIG ENDIAN機器上你應該定義,什么意思是“將整數放在3個字節”
嗯。 我認為,第二個提出的algorythm會好的,但是改變字節的順序:
你有他們2143.我想你需要321。 但最好檢查一下。
編輯:我檢查了維基 - x86是小端,他們說,所以algorythms是好的
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.