簡體   English   中英

在C ++中將4個字節轉換為3個字節

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM