簡體   English   中英

將圖像轉換為字節然后轉換為字符串時出現問題

[英]Problems converting image to bytes and then to string

我有一個基於套接字通信的應用程序,服務器將請求發送到客戶端以獲取簽名圖像。 簽名在客戶端獲取,然后發送回服務器。

為此,我使用了一個圖片框,將其數據轉換為字節,然后轉換為字符串,以通過套接字連接發送到服務器。 一切正常。

我在保存數據庫中接收到的數據時遇到問題,因為我需要將其保存為圖像類型,但是此時數據仍然是字符串,因此出現錯誤:

“操作數類型沖突:nvarchar與圖像不兼容”

我猜想是因為我正在嘗試將字符串發送到sql圖像類型?

嘗試調用該過程和錯誤的代碼(服務器端接收的數據作為字符串):

try
{
    using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["GetConnector"].ConnectionString))
    {
        SqlCommand sqlComm = new SqlCommand("PL_Device_ReadData", conn);
        sqlComm.Parameters.AddWithValue("@DeviceTypeID", DeviceID);
        sqlComm.Parameters.AddWithValue("@RequestID", RequestID);
        if (DeviceID != "5")
        {
            sqlComm.Parameters.AddWithValue("@Reading", Reading);
        }
        else if (DeviceID == "5")
        {
            sqlComm.Parameters.AddWithValue("@ImageReading", Reading);
            sqlComm.Parameters.Add("@ImageReading", SqlDbType.Image);
            sqlComm.Parameters["@ImageReading"].Value = Reading;
        }
        sqlComm.CommandType = CommandType.StoredProcedure;

        SqlDataAdapter da = new SqlDataAdapter();
        da.SelectCommand = sqlComm;

        da.Fill(ds);
    }
}

catch (Exception e)
{

}

存儲過程:

ALTER PROCEDURE [dbo].[PL_Device_ReadData]
    @DeviceTypeID INT,
    @RequestID INT,
    @Reading NVARCHAR(100) = NULL,
    @ImageReading IMAGE = NULL  
AS
BEGIN
--Data
    IF @DeviceTypeID = 5 
    BEGIN
        UPDATE dbo.DeviceRequests 
        SET ImageData = @ImageReading
        WHERE id = @RequestID
        AND DeviceTypeID = @DeviceTypeID
    END
    ELSE
    BEGIN   
        UPDATE dbo.DeviceRequests 
        SET Value = @Reading
        WHERE id = @RequestID
        AND DeviceTypeID = @DeviceTypeID
END 
END

將圖像轉換為字節:

byte[] imgData = null;
// storage for the img bytes
imgData = ImgToByteArray(picSignature.InitialImage, ImageFormat.Jpeg);

public static byte[] ImgToByteArray(Image img, ImageFormat imgFormat)
{
    byte[] tmpData = null;
    using (MemoryStream ms = new MemoryStream())
    {
        img.Save(ms, imgFormat);

        tmpData = ms.ToArray();
    }
    // dispose of memstream
    return tmpData;

}

將字節轉換為字符串(以通過套接字發送):

_Reading = System.Text.Encoding.UTF8.GetString(_imagevalues);

為此,我使用了一個圖片框,將其數據轉換為字節,然后轉換為字符串,以通過套接字連接發送到服務器。 一切正常。

給定您顯示的代碼,我建議可能沒有。 尤其是:

_Reading = System.Text.Encoding.UTF8.GetString(_imagevalues);

圖片數據不是 UTF-8編碼的文本,因此您不應使用Encoding.UTF8或任何其他編碼。 編碼旨在將自然純文本轉換為字節並返回。 相反,您具有任意二進制數據。

理想情況下,您應該將此套接字作為二進制數據通過套接字傳輸-尚不清楚為什么根本不需要字符串。 如果你真的需要一個字符串,但是,你應該字節轉換為文本使用的base64:

string base64 = Convert.ToBase64String(bytes);

然后在另一側,您可以執行相反的操作:

byte[] bytes = Convert.FromBase64String(base64);

但是正如我說的那樣,如果您控制協議,則僅以二進制形式傳輸字節而根本不將其轉換為文本會更清潔,更高效。 我們無法確定這是什么協議,因此很難知道是否可以選擇。

這個:

_Reading = System.Text.Encoding.UTF8.GetString(_imagevalues);

是錯的。 _imagevalues是否保存圖像的二進制數據? 比起這行代碼,您試圖將其解釋為字符串,這是錯誤的。 您只需要轉換圖像的每個字節即可說出其十六進制字符串表示形式。 然后通過網絡發送整個這樣的字符串。 例如,請參見此處如何將字節數組轉換為十六進制字符串,反之亦然? (如答案之一所述,這種轉換並不是真正必要的,您也可以發送純字節)。

然后在服務器端,您必須解析此十六進制字符串並將其轉換為字節數組,並可能保存在數據庫中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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